[Zend Framework] Zend_Httpを使ってAPIからファイルをアップロードする
Zend_Httpを使ってAPIからファイルをアップロードするプログラムを作ってみました。
http://example.com/api/file_post というAPIがあって、これを使ってファイルをアップロードすると仮定しています。
コードは以下のようになっています。
require_once 'Zend/Http/Client.php'; $url = "http://example.com/api/file_post"; $filename = "example.jpg"; $client = new Zend_Http_Client($url); // オプションの設定は省略 $client->setFileUpload($filename, 'file', null, 'image/jpeg'); $response = $client->request('POST');
これだけで完了です。通常のフォームからのアップロードと同様に、サーバのスクリプトから$_FILES['file'] で参照することができます。
Zend_Http_ClientのsetFileUpload()関数でアップロードするファイルを設定して、request()関数でHTTPリクエストをかけます。
リファレンスガイドではsubmit()関数を使っていたのですが、そのような関数は定義されていなかったので代わりにrequest()関数を使用しています。
続いて、setFileUpload()関数の引き数について説明します。
最初の引数では、アップロードするファイル名を指定します。ただし、この引数は第3引数の値で内容が変わってきます。
第3引数がnullの場合は、ここで指定されたファイルが実際にアップロードされます。もしnullでない場合はアップロードするときのファイル名としてこの値が使われるだけで、ファイルの内容は第3引数のものが使用されます。
$filename = "text.txt"; $text = "this is upload test"; $client->setFileUpload($filename, 'file', $text, 'text/plain'); $response = $client->request('POST');
この場合、たとえローカルに別の内容でtext.txtというファイルが存在していても、「this is upload test」という内容で送信されます。
2番目の引数ではフォーム名を指定します。
<input type="file" name="xxx"/>
のxxxにあたる部分ですね。
サーバスクリプト側では
$_FILES['file']
で参照できます、
3番目の引数ではアップロードするファイルの内容を指定します。先に述べたように、nullを指定すると第1引数で指定したファイルの内容がアップロードされます。
4番目の引数ではMIMEタイプを指定します。もし省略した場合は内部でmime_content_type() 関数を使って自動的に判定してくれます。mime_content_type()で判定に失敗した場合は、application/octet-streamというMIMEタイプでアップロードされます。
ここで使われるmime_content_type()関数ですが、この関数の使用は非推奨とされています。代わりにFileinfo関数を使ったほうがいいとありますね。。。
MIMEタイプがわかっている場合は、極力指定しておいたほうがいいでしょう。
あと、リクエストメソッドは必ずPOSTを使用しましょう。