这个二进制文件传输有什么问题(损坏 docx 文件)?

2023-11-30

我已经尝试解决这个问题一个多星期了,可以really在一些帮助下做。

我们使用 httprequest 将文件发布到 api。大多数文件都正常,但 docx 文件最终会损坏。

经过大量研究后,我非常确定我在二进制帖子中做错了一些事情,即向文件添加额外的数据/字节。

流正在关闭,我think我的边界和标题都是正确的......

下面的代码有没有明显的错误?或者有人能够为我指明正确的方向以进行修复。为什么要向此文件添加额外的数据?是 http 标头有问题,还是我错误地读取了流?造成我的困境的最可能原因是什么?

(我试图检查 docx 文件中的额外数据以找出它的来源。但我一直无法这样做。那里有很多 docx 修复工具,但我遇到过的没有一个提供有关错误,他们只是修复该文件。我尝试过 Open XML SDK 2.0 for Microsoft Office,但这不会打开损坏的文件,因此我无法将其与修复的文件进行比较。)

Code:

Sub PostTheFile(CVFile, fullFilePath, PostToURL)

    strBoundary = "---------------------------9849436581144108930470211272"
    strRequestStart = "--" & strBoundary & vbCrlf &_
        "Content-Disposition: attachment; name=""file""; filename=""" & CVFile & """" & vbcrlf & vbcrlf
    strRequestEnd = vbCrLf & "--" & strBoundary & "--" 

    Set stream = Server.CreateObject("ADODB.Stream")
        stream.Type = adTypeBinary 
        stream.Mode = adModeReadWrite     
        stream.Open
        stream.Write StringToBinary(strRequestStart)
        stream.Write ReadBinaryFile(fullFilePath)
        stream.Write StringToBinary(strRequestEnd)
        stream.Position = 0
        BINARYPOST= stream.read
        stream.Close

    Set stream = Nothing    

    Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
        httpRequest.Open "PATCH", PostToURL, False, "username", "pw"
        httpRequest.setRequestHeader "Content-Type", "multipart/form-data; boundary=""" & strBoundary & """"
        httpRequest.Send BINARYPOST
        Response.write "httpRequest.status: " & httpRequest.status 
    Set httpRequest = Nothing   
End Sub


Function StringToBinary(input)
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Charset = "UTF-8"
        stream.Type = adTypeText 
        stream.Mode = adModeReadWrite 
        stream.Open
        stream.WriteText input
        stream.Position = 0
        stream.Type = adTypeBinary 
        StringToBinary = stream.Read
        stream.Close
    set stream = Nothing
End Function

Function ReadBinaryFile(fullFilePath) 
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Type = 1
        stream.Open()
        stream.LoadFromFile(fullFilePath)
        ReadBinaryFile = stream.Read()
        stream.Close
    set stream = nothing
end function  

文件链接

以下是使用 API 之前和之后的文件的链接。我保留了它们really简单的。

http://fresherandprosper.com/cvsamples/testcv.corrupted.docx

http://fresherandprosper.com/cvsamples/testcv.notcorrupted.docx

Update

在 Edi9999 的出色帮助(见下文)之后,我以为我的问题已经解决了。我所要做的就是弄清楚如何在代码中生成不需要的附加序列并将其删除。

但我似乎无法确定要从代码中删除什么。一切都没有按预期进行。

然后我意识到......每次我发布文件时,结束顺序都会略有不同。

0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 

完全相同的文件,使用 30 秒后发布的完全相同的代码:

0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 00

几分钟后,又再次:

0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24

也许这值得一个新问题。但已经有大约 6 个与此问题相关的内容,所以我不愿意再添加一个。


这是我尝试对您的 docx 执行的操作:

  • 我用文字打开它们,腐化的确实是腐化的
  • 我解压了文件,它们完全相同

我观察了docx的大小,docx的大小是不同的。

所以我查看了二进制文件:文件的开头是相同的

504b 0304 1400 0600 0800 0000 2100 ddfc
9537 6601 0000 2005 0000 1300 0802 5b43
6f6e 7465 6e74 5f54 7970 6573 5d2e 786d
6c20 a204 0228 a000 0200 0000 0000 0000

但最后:

文件未损坏

6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24
0000 0000 

文件损坏

6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24
0000 0000 0a2d 2d2d 2d2d 2d2d 2d2d 

正如你所看到的,它们是一个序列:0a2d 2d2d 2d2d 2d2d 2d2d。文件的其余部分是相同的。当我删除这个序列时,文件不再损坏。

转换成ascii,0a2d 2d2d 2d2d 2d2d 2d2d is \n----

这可能是由于strRequestEnd = vbCrLf & "--" & strBoundary & "--"

但是,由于我不太清楚您的代码中发生了什么,如果您需要更多帮助,请更深入地解释这部分代码。

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个二进制文件传输有什么问题(损坏 docx 文件)? 的相关文章

随机推荐

  • 表依赖关系的递归查询没有递归得像我想要的那样

    我有一个想法 我可以编写一个查询来根据外键查找根表的所有后代表 查询看起来像这样 select level lpad 2 level 1 uc table name as TABLE uc constraint name uc r cons
  • 如何在 PHP 中访问嵌套关联数组数据

    我有一个索引数组 其中包含嵌套关联数组和嵌套索引数组 myArray array 0 gt array name gt Paul age gt 23 hobbies gt array 0 gt basketball pets gt dog
  • SSL 握手中的客户端证书身份验证

    我正在浏览 SSL 协议并尝试了解 SSL 握手中涉及的步骤 现在用于向服务器验证客户端 客户端证书身份验证 已完成 我想知道 客户端 中实际发生了什么证书验证 详细信息 SSL握手步骤 客户端向服务器发送客户端的 SSL 版本号 密码设置
  • 无法通过phpmyadmin导入数据库

    当我尝试上传数据库 794 kb 时出现错误 No data was received to import Either no file name was submitted or the file size exceeded the ma
  • 如何使用 PHP 从 mysql 读取值

    以下是我在 WordPress 数据库的 mysql 字段之一中看到的值 a 2 i 0 i 31 i 1 i 23 这是什么格式 如何使用 PHP 获取替代 I 的值 这是一个serialize d 变量 您可以使用unserialize
  • InnoDB排序真的那么慢吗?

    我的所有表都在 myISAM 中 但是当我长时间运行更新作业时 表级锁定开始让我丧命 我将主表转换为 InnoDB 现在我的许多查询需要 1 分钟以上才能完成 而在 myISAM 上它们几乎是瞬时完成的 他们通常被困在Sorting res
  • Python:类型错误:“str”对象不支持项目分配

    我在制作简单的战舰游戏时遇到这个问题 这是我的代码 board row O 5 lt lt lt
  • 使用 TLS 在 PHP 中建立连接

    我出于特殊目的编写了一个小型 SIP 客户端 基本上它使用函数连接到端口 5060fsockopen fp fsockopen 10 0 0 1 5060 errno errstr 30 然后基本上使用读取和写入SIP命令fread and
  • jQuery 计算字符并添加类

    是否可以使用 jQuery 来计算有多少个字符 例如 li 如果数量大于 XX 个字符 是否对该元素应用一个类 我见过很多 jQuery 字符计数器 即http plugins jquery com plugin tags characte
  • SQLAlchemy 与 asyncpg 崩溃并出现错误:asyncpg.InterfaceError - 无法执行操作:另一个操作正在进行中

    我正在使用 sqlalchemy 和 asyncpg 开发一个 fastapi 服务器来处理 postgres 数据库 对于每个请求 都会创建一个新会话 通过 fastapi 依赖项注入 如文档中所示 我在 postgres asyncpg
  • 如何在 Linux 中获取包含感兴趣的特定文件的最新文件夹并在 Python 中使用 Paramiko 下载该文件?

    我正在尝试使用 Python 3 中的 Paramiko 将特定文件从远程服务器 scp 到我的本地计算机 背景 有一个目录mydir在目标计算机 198 18 2 2 上 包含许多以名称开头的时间戳目录2020 目标机器 198 18 2
  • CardIO 无法获取我的卡信息

    我正在测试用于扫描信用卡的cardIO iOS SDK 我按照中的说明进行操作https github com card io card io iOS SDK 但我打开 CardIOPaymentViewController 它不扫描我的卡
  • 如何在 Windows 8 Metro 风格应用程序中获取摄像头源?

    我正在尝试在 Windows 8 Metro 风格应用程序中获取摄像头源 以便我可以对其进行一些更改 例如增强现实 我已经尝试过 但只能找到如何使用 CameraCaptureUI 捕获图像 谁能告诉我如何实现 AR 相机馈送 您所需要做的
  • 如何用java编写可执行程序? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将 Java 程序转换为 exe 文件 如何用java编写可执行程序 您实际上并不需要这样做 还有许多其他选项可用 正如 Philip 建议的那样 您可以使用可执行的 jar 文件 看http w
  • Go sql - 准备好的语句范围

    我正在使用 Go 1 6 x sql 包以及 PostGres 9 4 构建一个 API 我准备的陈述是否应该具有应用或请求范围 阅读完这些文档后 将它们限制在应用程序级别以减少准备阶段的数量似乎会更有效 然而 也许还有其他考虑因素 准备好
  • C 中的最小值和最大值使用基础知识

    该程序应该在用户输入 0 时结束 然后显示计数 总和 平均值 最小值和最大值 我能够算出总和和平均值 但我的最小值和最大值不起作用 int main int number 0 int count 0 int sum 0 int averag
  • 添加自定义 DataGridViewColumn,每个单元格带有标签和按钮

    我想添加一个自定义DataGridViewColumn to my DataGridView 此列应在每行创建以下单元格 起初我创建了一个自定义UserControl创建一个带有按钮的标签 private class AllocationC
  • 从 JAR 中保存首选项

    我目前正在编写一个游戏 并且已经到了我需要用户能够保存诸如 JFrame 大小 键绑定等首选项的地步 用户将通过从我的网站下载的 jar 来运行游戏 我决定使用 java util prefs Preferences 下的 Preferen
  • 如何不断添加到JS变量?

    每次用户在框中输入值时 我都会尝试连续添加到 js 变量 到目前为止 如果他们输入 21 警报会说 您的余额是 12 英镑 但如果我输入 15 我希望它说您的余额是 27 但它会说 15 或者只是最新的数量 代码如下
  • 这个二进制文件传输有什么问题(损坏 docx 文件)?

    我已经尝试解决这个问题一个多星期了 可以really在一些帮助下做 我们使用 httprequest 将文件发布到 api 大多数文件都正常 但 docx 文件最终会损坏 经过大量研究后 我非常确定我在二进制帖子中做错了一些事情 即向文件添