[求助]文件以二进制形式保存插入
本帖最后由 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-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!没有测试,但感觉必须能成,不行来战 不知道是不是这个意思,没法测试
$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-15 19:05 编辑
afan 发表于 2019-8-13 16:37
不知道是不是这个意思,没法测试
谢谢A版回复,测试失败。附件是完整源码,密码发私信给你。 king8462 发表于 2019-8-13 18:02
谢谢A版回复,测试失败。附件是完整源码,密码发私信给你。
不看完整码,没时间搞,最多帮忙看看最简示例 afan 发表于 2019-8-13 18:04
不看完整码,没时间搞,最多帮忙看看最简示例
代码很短的。里面的文本上传测试成功 king8462 发表于 2019-8-13 18:07
代码很短的。里面的文本上传测试成功
随便看了下,你确定改了?
$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe")
我上面的第13行 afan 发表于 2019-8-13 18:18
随便看了下,你确定改了?
$scwj = FileOpen(@ScriptDir & "\exe测试文件.exe")
改了,修改后的文件明显过大,应该800kb差不多。
$data = FileRead($file) 必须以$data = FileRead($file,16)字节形式读取,要不然post失败。 king8462 发表于 2019-8-13 18:32
$data = FileRead($file) 必须以$data = FileRead($file,16)字节形式读取,要不然post失败。
你这句是在代码不完整的情况下我改的,鬼知道后面是做什么用? 我改那句主要是看它上一句打开了文件而没有关闭的代码,直接 FileRead 可以不用打开。 afan 发表于 2019-8-13 19:02
你这句是在代码不完整的情况下我改的,鬼知道后面是做什么用? 我改那句主要是看它上一句打开了文件而没 ...
谢谢版主!我实在是不知道还能怎么改了 不知道服务端如何接收数据创建文件的,如果生成的文件有两倍大那就是当字符串而非二进制数据处理了 afan 发表于 2019-8-13 20:10
不知道服务端如何接收数据创建文件的,如果生成的文件有两倍大那就是当字符串而非二进制数据处理了
服务端应该就是把其他的数据裁剪掉,只保留exe读取的那部分。生成的文件应该是exe文件本身的大小加上guid.txt大小,现在生成的太大,肯定有问题 。我用易语言导出过修改后的$data数据,就是这样子的。 king8462 发表于 2019-8-13 20:21
服务端应该就是把其他的数据裁剪掉,只保留exe读取的那部分。生成的文件应该是exe文件本身的大小加上guid ...
我的意思是 现在的文件是否两倍大?…… afan 发表于 2019-8-13 20:25
我的意思是 现在的文件是否两倍大?……
是的,1.64mb,两倍了。