前提・実現したいこと
ローカルからサーバーにファイルをアップロードする機能を作っています。
ローカル側はC#で、サーバー側はJavaで進めています。
サーバー側の機能ができたと思ったのでAdvanced REST clientで以下のようなリクエストを送信したところ
期待通りの動作をしました。
そこで今度はC#でAPIを呼び出す機能を作ったのですが、おそらくHeaderの設定がうまくできておらずアップロードはされませんでした。
どうすればmultipartの設定がうまくできるでしょうか。
該当のソースコード
using (var httpClient = new HttpClient()) using (var multipart = new MultipartFormDataContent()) { var fileContent = new StreamContent(File.OpenRead(finfo.FullName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { Name = "upload_file", FileName = finfo.FullName }; multipart.Add(fileContent); multipart.Add(new StringContent("test1.jpg"), "fileName"); multipart.Add(new StringContent("testid"), "id"); multipart.Add(new StringContent("testpw"), "pw"); string url = "http://localhost:8888/upload"; // 送信 var postAsyncTask = httpClient.PostAsync(url, multipart); postAsyncTask.Wait(); var responseMessage = postAsyncTask.Result; }
試したこと
upload_file(ファイルの部分)だけを送信するAPIを作って試したところ、アップロードができたので
var fileContent = new StreamContent(File.OpenRead(finfo.FullName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { Name = "upload_file", FileName = finfo.FullName }; multipart.Add(fileContent);
のところは大丈夫なのだと思います。
発生している問題・エラーメッセージ
Java側のログも確認してみましたが、そもそもアップロードの処理すら呼ばれていないようだったのでやはりHeaderの設定がおかしいっぽいです。
###追記
情報の追加依頼にあったことを確認しました。
ARCから送信(成功)
POST /test/upload HTTP/1.1 HOST: scan-test1.vamp-dev.com content-type: multipart/form-data; boundary=----WebKitFormBoundaryCchrrc3v9ftz6DIc content-length: 430850 ------WebKitFormBoundaryCchrrc3v9ftz6DIc Content-Disposition: form-data; name="fileName" test1.jpg ------WebKitFormBoundaryCchrrc3v9ftz6DIc Content-Disposition: form-data; name="id" testid ------WebKitFormBoundaryCchrrc3v9ftz6DIc Content-Disposition: form-data; name="pw" testpw ------WebKitFormBoundaryCchrrc3v9ftz6DIc Content-Disposition: form-data; name="upload_file"; filename="20191105_142256_0002.jpg" Content-Type: image/jpeg ......JFIF............... ".u.."..........C.... ...
アプリから送信(失敗)
POST /test/upload HTTP/1.1 Content-Type: multipart/form-data; boundary="917b274a-b210-4116-bf46-d61b6691f127" Host: scan-test1.vamp-dev.com Content-Length: 430991 Expect: 100-continue Connection: Keep-Alive --917b274a-b210-4116-bf46-d61b6691f127 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=fileName 20191107_133540_0002.jpg --917b274a-b210-4116-bf46-d61b6691f127 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=id testid --917b274a-b210-4116-bf46-d61b6691f127 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=pw testpw --917b274a-b210-4116-bf46-d61b6691f127 Content-Disposition: attachment; name=upload_file; filename="C:\tmp\test\scantest\file\9991\20191107\133540\20191107_133540_0002.jpg"
Headerの設定がおかしいがどうかは今の情報じゃわかりません。
Fiddler を使ってアプリから送ったリクエストを確認してください。
それとAdvanced REST clientで送ったリクエストを比較してみてください。
追記に上記のことを書きました!
これであっていますかね?
パッと見おかしいところは無いようですので、寄せていくしかないと思います。
Content-Type: text/plain; charset=utf-8 を削ってみるとか
失敗の方の Content-Disposition ヘッダは attachment でなく form-data とすべきでは?
Content-Type: text/plain; charset=utf-8 ヘッダは StringContent を使うとデフォルトで付与されるようですが、それは問題なさそうです。
設定方法は私の回答で紹介した記事にありますので見てください。
回答1件
あなたの回答
tips
プレビュー