1

Zend Http クライアントを使用して外部サービスを呼び出しています。このサービスを使用すると、ファイルをストレージ システムにアップロードできます。関連するパラメーター (ユーザー ID など) をクエリ文字列で送信する必要があり、ファイルのアップロード コンテンツはコンテンツ タイプが "application/zip" の POST 本文で送信する必要があります (私は 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] Accept-encoding: gzip、deflate

ユーザーエージェント: Zend_Http_Client Cookie:

AZT=9cMFAIBgG-eM1K|Bw7Qxlw7pBuPJwm0PCHryD;

コンテンツ タイプ: マルチパート/フォーム データ。境界=---ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8

コンテンツの長さ: 2967

-----ZENDHTTPCLIENT-05535ba63b5130ab41d9c75859f678d8

Content-Disposition: フォームデータ。名前="コンテンツ"; ファイル名="agilixContent.zip"

コンテンツ タイプ: アプリケーション/zip

[RAWファイルデータはこちら]

つまり、基本的に、POST コンテンツ タイプ ヘッダーを設定したにもかかわらず、値が「multipart/form-data」の別のコンテンツ タイプ ヘッダーがあるため、外部サービスから間違ったコンテンツ タイプを送信したことが通知されます。そのコンテンツヘッダーを変更/削除しようとしましたが、役に立ちませんでした。リクエストにこれら 2 つの重複した「コンテンツ タイプ」ヘッダーが含まれないように、そのヘッダーを削除するにはどうすればよいですか?

4

2 に答える 2

0

Zend HTTP クライアントでそれを行う方法はわかりませんが、プレーンな 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 に答える