1

我在为Valence API中的 News 上传文件附件时遇到了一些问题。我正在使用 PHP,当我尝试发出发布请求时,该操作永远不会完成。我在命令行上运行它,所以我必须终止进程才能终止程序。

我的文件数据和详细信息(名称、类型和大小)存储在数据库中,我只使用一个调用来发布所有内容,即 JSON 格式的新闻和文件附件。我使用以下格式发布消息(如 API 文档中所述):

内容类型:多部分/混合;边界=e9e1c17c958e2a89a192bf5d3f7d1ffd 内容长度:46538

--e9e1c17c958e2a89a192bf5d3f7d1ffd 内容类型:应用程序/json

{"Title":"Some News","Body":{"Text":"这个</span>是一个非常</span>丰富多彩的标题</span>","Html":"这个</span>是一个非常</span>丰富多彩的标题</span>"},"StartDate":"2013-11-06T05:00:00.000Z","EndDate":"2013-11-30T05:00:00.000Z", "IsGlobal":false,"IsPublished":true,"ShowOnlyInCourseOfferings":false}

--e9e1c17c958e2a89a192bf5d3f7d1ffd 内容处置:表单数据;名称="FC.png"; 文件名="FC.png"

内容类型:图片/png

{} --e9e1c17c958e2a89a192bf5d3f7d1ffd--

我猜由于编码,我看不到文件内容。我将此消息中的内容长度计算为:JSON 数据的字符串长度 + 文件大小(以字节为单位)。

我非常具体的问题是,可以直接从数据库中发布文件,还是建议先将文件写入磁盘然后尝试发布。如果有人可以向我指出一个在线示例,我也将不胜感激,其中有一个使用 PHP 的预先存在的示例代码。

还有一件事。如果我不包括内容长度的文件大小(以字节为单位),那么除了文件附件之外它工作正常。它的大小为 29 字节,当我单击它时,它会以损坏的数据错误打开。

任何形式的帮助将不胜感激。谢谢。

4

2 回答 2

0

HTTP 请求的Content Length必须是整个HTTP 正文的长度(字节数)。这意味着 JSON 结构的大小、文件流中的字节数以及所有周围的正文部分标头/分隔符和空格的长度。

对于您上传的文件数据的来源数据存储没有特殊要求。本质上,您在正文中形成一个包含多个部分的 HTTP 请求:第一部分必须是 JSON 结构(媒体类型application/json);第二部分应该是“文件”的字节,并且该正文部分的媒体类型设置得当image/png或其他) - 无论您是从数据库还是从文件中收集该字节流,都无关紧要。

于 2013-12-11T19:21:57.317 回答
0

发现我做错了什么。在使用 json_encode 之前需要对文件文档数据进行 UTF 编码。数据在 json_encode 期间丢失,因为它不理解特殊字符。代码片段:

$fileData = array(
    'FileName' => $attachment->getDocumentFilename(),
    'FileType' => $attachment->getDocumentFileType(),
    'FileSize' => $attachment->getDocumentSizeByte(),
    'FileData' => utf8_encode($attachment->getDocument())
);
于 2015-08-24T18:21:47.163 回答