king8462 发表于 2019-8-13 13:46:04

[求助]文件以二进制形式保存插入

本帖最后由 king8462 于 2019-8-13 13:47 编辑

想借用下面的易语言代码用于post提交数据:
字节集数据 = 读入文件 (FilePath)
data = 到字节集 (#POST_UP)
data = 子字节集替换 (data, 到字节集 (“”), 到字节集 (guid), , )
data = 子字节集替换 (data, 到字节集 (“”), 到字节集 (pz), , )
data = 子字节集替换 (data, 到字节集 (“[文件名]”), 到字节集 (文本_取右边 (FilePath, “\”)), , )
data = 子字节集替换 (data, 到字节集 (“[时间]”), 到字节集 (V8取标准时间 ()), , )
data = 子字节集替换 (data, 到字节集 (“[文本数据]”), 字节集数据, , )
http.Open (“POST”, “url”)
http.SendBin (到字节集 (data), 真)


但运行下面的au3代码把exe文件插入进去后发现exe文件大小改变了,而且post后exe无法打开。不知道哪里出错了,请高手帮忙修改一下。附件为guid.txt文件
   
   $guid="wu_1di4a1i7l1mmru1n1udfp807l90"
   $pz="SF5Rc8mkQQacKUKxYK/ao8coslHrvh7dthxXFuoln40OXxqTtYb9OclvqFqgBC1z"
   $date="Tue Aug 13 2019 09:39:08 GMT 0800 (中国标准时间)"
   
   Local $file = @ScriptDir & "\guid.txt"
   $sfile=FileOpen($file)
   Local $chars = FileRead($sfile)
   $chars = StringReplace($chars,"",$guid)
   $chars = StringReplace($chars,"",$pz)
   $chars = StringReplace($chars,"[文件名]","exe测试文件.exe")
   $chars = StringReplace($chars,"[时间]",$date)
   
$scwj=FileOpen(@ScriptDir&"\exe测试文件.exe")
$sText= FileRead($scwj)
FileClose(@ScriptDir&"\exe测试文件.exe")      
$chars = StringReplace($chars,"[文本数据]",$sText)
   FileWrite(FileOpen($file,2),$chars)
   FileClose($file)

$file=FileOpen($file,16)
$data=FileRead($file)

;以下post代码部分省略
$httpObj.Open ("POST", "url")
$httpObj.Send($data)
$httpObj.WaitForResponse()



afan 发表于 2019-8-13 13:46:05

本帖最后由 afan 于 2019-8-14 00:19 编辑

感觉被楼主带偏了,Au3 本身就可以完成全套的 Post 不说,就光当前的这个问题而言,就不应该替换完成后写入txt文本文档再读取,这样二进制文件的数据肯定已经损坏。应该直接二进制替换,然后直接Post:
$guid = "wu_1di4a1i7l1mmru1n1udfp807l90"
$pz = "SF5Rc8mkQQacKUKxYK/ao8coslHrvh7dthxXFuoln40OXxqTtYb9OclvqFqgBC1z"
$date = "Tue Aug 13 2019 09:39:08 GMT 0800 (中国标准时间)"

Local $file = @ScriptDir & "\guid.txt"
Local $chars = FileRead($file)
$chars = StringReplace($chars, "", $guid)
$chars = StringReplace($chars, "", $pz)
$chars = StringReplace($chars, "[文件名]", "exe测试文件.exe")
$chars = StringReplace($chars, "[时间]", $date)
$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe", 16)
$sText = StringTrimLeft(FileRead($scwj), 2)
FileClose($scwj)
$chars = StringToBinary($chars)
$chars = StringReplace($chars, "5BCEC4B1BECAFDBEDD5D", $sText)
$data = $chars;这里直接就可以拿去Post,不需要经过任何的读写操作

这样应该OK!没有测试,但感觉必须能成,不行来战

afan 发表于 2019-8-13 16:37:22

不知道是不是这个意思,没法测试
$guid = "wu_1di4a1i7l1mmru1n1udfp807l90"
$pz = "SF5Rc8mkQQacKUKxYK/ao8coslHrvh7dthxXFuoln40OXxqTtYb9OclvqFqgBC1z"
$date = "Tue Aug 13 2019 09:39:08 GMT 0800 (中国标准时间)"

Local $file = @ScriptDir & "\guid.txt"
;~ $sfile = FileOpen($file)
Local $chars = FileRead($file)
$chars = StringReplace($chars, "", $guid)
$chars = StringReplace($chars, "", $pz)
$chars = StringReplace($chars, "[文件名]", "exe测试文件.exe")
$chars = StringReplace($chars, "[时间]", $date)

$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe", 16)
$sText = FileRead($scwj)
FileClose($scwj)
$chars = StringReplace($chars, "[文本数据]", $sText)
Local $hFo = FileOpen($file, 2 + 512)
FileWrite($hFo, $chars)
FileClose($hFo)

$data = FileRead($file)

king8462 发表于 2019-8-13 18:02:08

本帖最后由 king8462 于 2019-8-15 19:05 编辑

afan 发表于 2019-8-13 16:37
不知道是不是这个意思,没法测试
谢谢A版回复,测试失败。附件是完整源码,密码发私信给你。

afan 发表于 2019-8-13 18:04:37

king8462 发表于 2019-8-13 18:02
谢谢A版回复,测试失败。附件是完整源码,密码发私信给你。

不看完整码,没时间搞,最多帮忙看看最简示例

king8462 发表于 2019-8-13 18:07:29

afan 发表于 2019-8-13 18:04
不看完整码,没时间搞,最多帮忙看看最简示例

代码很短的。里面的文本上传测试成功

afan 发表于 2019-8-13 18:18:38

king8462 发表于 2019-8-13 18:07
代码很短的。里面的文本上传测试成功

随便看了下,你确定改了?
$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe")

我上面的第13行

king8462 发表于 2019-8-13 18:28:27

afan 发表于 2019-8-13 18:18
随便看了下,你确定改了?
$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe")



改了,修改后的文件明显过大,应该800kb差不多。

king8462 发表于 2019-8-13 18:32:48

$data = FileRead($file) 必须以$data = FileRead($file,16)字节形式读取,要不然post失败。

afan 发表于 2019-8-13 19:02:15

king8462 发表于 2019-8-13 18:32
$data = FileRead($file) 必须以$data = FileRead($file,16)字节形式读取,要不然post失败。

你这句是在代码不完整的情况下我改的,鬼知道后面是做什么用? 我改那句主要是看它上一句打开了文件而没有关闭的代码,直接 FileRead 可以不用打开。

king8462 发表于 2019-8-13 20:06:45

afan 发表于 2019-8-13 19:02
你这句是在代码不完整的情况下我改的,鬼知道后面是做什么用? 我改那句主要是看它上一句打开了文件而没 ...

谢谢版主!我实在是不知道还能怎么改了

afan 发表于 2019-8-13 20:10:27

不知道服务端如何接收数据创建文件的,如果生成的文件有两倍大那就是当字符串而非二进制数据处理了

king8462 发表于 2019-8-13 20:21:36

afan 发表于 2019-8-13 20:10
不知道服务端如何接收数据创建文件的,如果生成的文件有两倍大那就是当字符串而非二进制数据处理了

服务端应该就是把其他的数据裁剪掉,只保留exe读取的那部分。生成的文件应该是exe文件本身的大小加上guid.txt大小,现在生成的太大,肯定有问题 。我用易语言导出过修改后的$data数据,就是这样子的。

afan 发表于 2019-8-13 20:25:59

king8462 发表于 2019-8-13 20:21
服务端应该就是把其他的数据裁剪掉,只保留exe读取的那部分。生成的文件应该是exe文件本身的大小加上guid ...

我的意思是 现在的文件是否两倍大?……

king8462 发表于 2019-8-13 20:29:20

afan 发表于 2019-8-13 20:25
我的意思是 现在的文件是否两倍大?……

是的,1.64mb,两倍了。
页: [1] 2 3
查看完整版本: [求助]文件以二进制形式保存插入