Zend_Http_Client - 为什么我的POST请求发送错误的内容类型标头?

时间:2012-05-25 18:17:34

标签: php zend-framework zend-http-client

我正在使用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” ”。我已经尝试更改/删除该内容标题,但无济于事。 如何删除该标题,以便我的请求中不会出现这两个重复的“内容类型”标题?

2 个答案:

答案 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/