質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1295閲覧

C# httpClient mime

退会済みユーザー

退会済みユーザー

総合スコア0

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/09/11 08:06

linux コマンド curlで画像を送信することが出るサーバーがありますが、linuxではなくwindows でhttp postをしたいのでC#に置き換えたいのですが。curl -Fの理解がいまいちできずにいます。
色々調べていくと curl -Fがform構造?mimeタイプだって言うことが最近分かったぐらいのレベルです。
そしてHttpClientを使用するなら
MultipartFormDataContentを使用すればいいだとわかりました。
しかしエラー400を返されるので構文が間違っているのだと思われますが。
どのように修正すればいいのでしょうか?
どのように質問していいのか上手く言えないため修正箇所があれば教えてください。よろしくお願いします

linux

1//これは問題なく実行されます 2curl -F id=123 -F pw=456 -F To=hogeid -F file=@tes.jpg https://relive.abc/api/upload

C#

1//C#に置き換えたいです。 2HttpClient _httpClient = new HttpClient(); 3 Uri uri = new Uri("https://relive.abc/api/upload"); 4 MultipartFormDataContent content = new MultipartFormDataContent(); 5 ByteArrayContent data5 = new ByteArrayContent(File.ReadAllBytes(@"D:\test.png")); 6 7//id,pw,toの値は下記のように設定してあります恐らくここが間違っているのかと個人的に思っています 8ByteArrayContent data1 = new ByteArrayContent(System.Text.Encoding.ASCII.GetBytes("123")); 9content.Add(data1, "id"); 10ByteArrayContent data2 = new ByteArrayContent(System.Text.Encoding.ASCII.GetBytes("456")); 11content.Add(data2, "pw"); 12ByteArrayContent data3 = new ByteArrayContent(System.Text.Encoding.ASCII.GetBytes("hogeid")); 13content.Add(data3, "To"); 14 Debug.WriteLine(await _httpClient.PostAsync(uri, content)); 15//ここのログは400と出る。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/11 09:21

その API の仕様を書けませんか?
guest

回答2

0

ベストアンサー

質問へのコメント、

その API の仕様を書けませんか?

に返事がありませんが・・・

自分の Windows 10 PC に付属の curl で以下のコマンドを試してみると、(注: -x 127.0.0.1:8888 は Fiddler でキャプチャするため追加。URL は自分の PC のローカル IIS に設定したサイト)

curl -x 127.0.0.1:8888 -F id=123 -F pw=456 -F To=hogeid -F file=@Sig552T8.jpg http://websiteproject.com/0072-FileUpload.aspx

要求は以下のように multipart/form-data 形式になるので(Fiddler の画像)、

イメージ説明

HttpClient を使うなら、MultipartFormDataContent クラスのインスタンスを生成し、それに HttpContent クラスの派生クラスを multipart の各パートとして Add します。

ここまでは質問者さんが予想した通りですが、使い方に問題があるようです。

使用する HttpContent クラスの派生クラスは、文字列 (上の例では id=123, pw=456, To=hogeid) を送信する場合は StringContent クラスを、ファイル (上の例では Sig552T8.jpg) を送信する場合は StreamContent クラスを使うのがよさそうです。

具体例は以下の記事を見てください。

HttpClient でファイルアップロード
http://surferonwww.info/BlogEngine/post/2019/08/11/file-upload-by-using-httpclient.aspx

投稿2020/09/12 00:43

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/13 23:58

申し訳ございません仕様書等を書くことはできません。 丁寧な回答ありがとうございます一度試してみます。
退会済みユーザー

退会済みユーザー

2020/09/14 00:09

もしうまくいかなかったら、上の回答のように Fiddler で要求・応答をキャプチャして、うまくいくという curl の場合と見比べてください。そこにヒントが見つかると思います。 上の回答は、要求のボディを自分の Windows 10 PC 付属の curl のものと同じにするにはどうするかということだけです。要求ヘッダーの内容他にも何か約束があるかは API の仕様を開示してもらわないと分かりません。
退会済みユーザー

退会済みユーザー

2020/09/15 03:00

ありがとうございます。最終的にはfiddler everywhereでプロキシ設定を行い。 linuxのcurlを解析し。実現させました。 fiddlerのソフトの情報提供ありがとうございます。fiddler everywhereのソフトの存在が今回分かり非常に助かりました。
guest

0

C#のHttpClientでMultiPartのデータをPOST
これでいけないですかね。
実サーバでやる前に、ローカルでテスト用のWebサーバ立てて送信データ確認した方がいいとは思いますけど。

投稿2020/09/11 11:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/13 23:58

はいありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問