我正在使用Zend Http客户端调用外部服务。该服务允许我将文件上传到他们的存储系统。它需要在查询字符串中发送相关的params(userid等),并且文件上传内容应该在POST主体中以内容类型“application / zip”发送(我发送一个zip文件)有各种各样的东西)。
为此,我使用zend客户端的setParameterGet()函数在查询字符串中设置params。然后,我使用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
主持人:[主机]接受编码:gzip,deflate
User-Agent:Zend_Http_Client Cookie:
AZT = 9cMFAIBgG-eM1K | Bw7Qxlw7pBuPJwm0PCHryD;
内容类型:multipart / form-data;边界= --- ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8
内容长度:2967
----- ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8
内容 - 处置:表单数据; NAME = “内容”; filename =“agilixContent.zip”
内容类型:application / zip
[RAW FILE DATA HERE]
所以基本上,即使我设置了POST内容类型标头,我的外部服务也告诉我发送了错误的内容类型,因为还有另一个内容类型的标头,其值为“multipart / form-data” ”。我已经尝试更改/删除该内容标题,但无济于事。 如何删除该标题,以便我的请求中不会出现这两个重复的“内容类型”标题?
答案 0 :(得分:2)
如果您想使用“application / zip”作为内容类型上传文件,则不应使用->setFileUpload()
,而应使用->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兆字节,我不会打扰它。
答案 1 :(得分: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/