いろいろ準備中

[Zend Framework] Zend_Httpを使ってAPIからファイルをアップロードする

7月 16th, 2008 Posted in Zend Framework

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を使用しましょう。

コメントを投稿する