Guzzleを使ってフォームからファイルをアップロードさせる機能を作っています。アップロード先はkintoneで、Excel,Word,pdf,jpgなどをアップロードします。表題の通りファイル名が日本語の時にファイル名が正しく出ず、docxでは開けなくなってしまいます。
(追記)kintoneのドキュメントに「※日本語ファイル名の場合は UTF8 でエンコードした内容を指定して下さい。」と記載がありました。
試したこと
Uploadテスト.docx → 問題なし(アップロード後のファイル名:Uploadテスト.docx)
Upload_test.docx → 問題なし(アップロード後のファイル名:Upload_test.docx)
テスト.docx → 問題あり(アップロード後のファイル名:.docx)
ファイル名をエンコードしてみましたが同じ結果でした。
流れとしては
フォームからGuzzleでkintoneへファイルをアップロード
↓
fileKeyを取得
↓
他のフォーム項目と合わせてfileKeyをkintoneへPOST
という方法になります。
fileKeyは取得できておりますし、ファイルの中のデータはそのままアップされているのでファイル名だけが問題です。htmlにはUTF-8を指定しています。
試しに$_FILESの中をみてみたところ
array(1) {
["file"]=>
array(5) {
["name"]=>
string(14) "テスト.docx"
["type"]=>
string(71) "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
["tmp_name"]=>
string(14) "/tmp/phpnAUzQi"
["error"]=>
int(0)
["size"]=>
int(16651)
}
}
となっております、
また、var_dumpでヘッダーをみてみたところ
["Content-Type"]=> array(1) { [0]=> string(30) "application/json;charset=utf-8" }
となっておりました。
エンコードの仕方が間違っていますでしょうか。調べてもGuzzleドキュメントをみても解決方法が見つからず困っています。
初心者なため簡単な解決法をどうかご教授いただければ幸いです。
【環境】
guzzlehttp/guzzle: 6.5
php 7.2.34
function fileupload(){ $Url = "https://xxxxx.cybozu.com/k/v1/file.json"; $client = new \GuzzleHttp\Client([ 'http_errors' => false ]); $filename = mb_convert_encoding($_FILES['resume']['name'], "UTF-8", "auto"); $res = $client->request('POST', $Url,[ 'multipart' => [ [ 'name' => 'file', 'contents' =>fopen($_FILES['file']['tmp_name'], 'r'), 'filename' => $filename, ] ], 'headers' => [ 'X-Cybozu-API-Token' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ], ]); $response = json_decode($res->getBody()); if($res->getStatusCode() == 200){ return $response->fileKey; }else{ } }
回答1件
あなたの回答
tips
プレビュー