1

我正在使用 Zend Http 客户端调用外部服务。该服务允许我将文件上传到他们的存储系统。它需要在查询字符串中发送相关参数(用户 ID 等),文件上传内容应在 POST 正文中发送,内容类型为“application/zip”(我发送的是 zip 文件里面有各种各样的东西)。

为此,我使用 zend 客户端的 setParameterGet() 函数在查询字符串中设置参数。然后我使用 setFileUpload() 函数设置文件上传内容:

$this->client->setFileUpload($zipFilePath, 'content', null, 'application/zip');

但是,该服务告诉我我发送的内容类型错误,即“multipart/form-data”

这是 Zend 客户端发送到服务的原始标头(请注意,我已经删除了一些敏感信息,将它们替换为包含在 [] 括号中的项目名称)

POST https://[ServiceURL]?cmd=[COMMAND]&enrollmentid=[ENROLLMENTID]&itemid=[ITEMID]

HTTP/1.1

主机:[HOST] 接受编码:gzip、deflate

用户代理: Zend_Http_Client Cookie:

AZT=9cMFAIBgG-eM1K|Bw7Qxlw7pBuPJwm0PCHryD;

内容类型:multipart/form-data;边界=---ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8

内容长度:2967

-----ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8

内容处置:表单数据;名称=“内容”;文件名="agilixContent.zip"

内容类型:应用程序/zip

[此处的原始文件数据]

所以基本上,即使我设置了 POST 内容类型标头,我的外部服务也会告诉我我发送了错误的内容类型,因为还有另一个值为“multipart/form-data”的内容类型标头。我尝试更改/删除该内容标题,但无济于事。如何删除该标头,以便我的请求中不会有这两个重复的“内容类型”标头?

4

2 回答 2

2

->setFileUpload()如果您想使用“application/zip”作为内容类型上传文件,则不应使用->setRawData(). setFileUpload()用于模仿您不需要的基于 HTML 表单的文件上传。

有关详细信息,请参阅http://framework.zend.com/manual/en/zend.http.client.advanced.html#zend.http.client.raw_post_data。您需要的(基于您的原始示例)将类似于:

$zipFileData = file_get_contents($zipFilePath);
$this->client->setRawData($zipFileData, 'application/zip');
$response = $this->client->request('POST');

请注意,如果您的 ZIP 文件可能非常大(例如超过几兆字节),您可能需要使用 ZHC 的流媒体支持功能,因此请避免占用内存。如果您知道您的文件总是小于 5-10 兆字节,那么我不会为此烦恼。

于 2012-05-29T16:54:58.420 回答
0

我不确定如何使用 Zend HTTP Client 做到这一点,但我相信你可以使用纯 cURL 做到这一点。正如您必须知道的,cURL 为您提供了很大的灵活性,我还没有深入研究 Zend,但 Zend 可能会在内部使用 cURL。

<?php

// URL on which we have to post data
$url = "http://localhost/tutorials/post.php";
// Any other field you might want to catch
$post_data = "khan";
// File you want to upload/post
//$post_data['zip_file'] = "@c:/foobar.zip";

$headers[] = "Content-Type: application/zip";

// Initialize cURL
$ch = curl_init();
// Set URL on which you want to post the Form and/or data
curl_setopt($ch, CURLOPT_URL, $url);
// Data+Files to be posted
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// Set any custom header you may want to set or override defaults
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
// Pass TRUE or 1 if you want to wait for and catch the response against the request made
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// For Debug mode; shows up any error encountered during the operation
curl_setopt($ch, CURLOPT_VERBOSE, 1);
// Execute the request
$response = curl_exec($ch);

// Just for debug: to see response
echo $response;

我希望上面的片段对你有用。这是下面提到的我的博客文章中的一些修改代码。

参考:http: //blogs.digitss.com/php/curl-php/posting-or-uploading-files-using-curl-with-php/

于 2012-05-25T18:43:07.247 回答