私はc#を使用していて、別のサーバー上のフォームにデータを投稿しようとしています。フォームには、いくつかのパラメーターとともに画像の添付ファイルが含まれています。
firstName = First lastName = Last Image = ImageFile.JPG
これを送信するメソッドを構築する方法の例を探しています。私はHttpWebRequestを調べてきましたが、例が必要です。
私はc#を使用していて、別のサーバー上のフォームにデータを投稿しようとしています。フォームには、いくつかのパラメーターとともに画像の添付ファイルが含まれています。
firstName = First lastName = Last Image = ImageFile.JPG
これを送信するメソッドを構築する方法の例を探しています。私はHttpWebRequestを調べてきましたが、例が必要です。
私はこれで動作しています - 私のテストはASP.NETでホストされたWebページを使用しています...しかし、基本的なテクニックはどこでも動作するはずです。
手動で Web サーバーに投稿するのは少し面倒です。私は常に HttpWatch のような便利なツールから始めます。実際にページに投稿し、ツールを使用して投稿内容を確認し、送信されたヘッダーを確認し、送信された Cookie を確認します。
この場合、ヘッダーのコンテンツ タイプが に設定されmultipart/form-data
、境界が定義されます。次に、ストリームを見ると、バイトがサーバーにどのように送信されているかがわかります。
これらの手順が完了したら、C# から同じバイトを送信する方法を理解する必要があります。
このコード例は、実際に機能する 1 つの例を示しているにすぎません。明らかに、製品コードはいくつかのことをさらに数歩進めます。
1)最初に接続して、ここにあるように配線するのではなく、新しい __VIEWSTATE および __EVENTVALIDATION パラメータを取得します。
2) フォーム パラメータ (fname、lname) を見て、それらの名前を確認します。
3) パラメータの新しいものを探す場合があります。
4)boundry
都度発生する場合があります。これについてはよくわかりませんが、ブラウザはこのようにします。
5) ファイル名はハードワイヤードではありません。
6) 最終的なバイト配列を作成するもっと効率的な方法があるでしょう。
コードは次のとおりです。
private void SimulatePost_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
const string boundry = "---------------------------7dc2a722a12c8";
string contentType = string.Format("multipart/form-data; boundary={0}", boundry);
string postData = string.Format(@"--{0}
Content-Disposition: form-data; name=""__VIEWSTATE""
/wEPDwUKLTk2MDkyMzQyMw9kFgJmD2QWAgIDDxYCHgdlbmN0eXBlBRNtdWx0aXBhcnQvZm9ybS1kYXRhZGQLrqV5FQTzi8K9ogSJlS44c0L0Ou3+MaYfFPwjKPwjZQ==
--{0}
Content-Disposition: form-data; name=""__EVENTVALIDATION""
/wEWBAKXx6zsBALa1ffGCwK80PHQDQLurOv8AU7Jo8sYj9+E/zw7RsmFraAotTazyvQc7T2VseLqSwGO
--{0}
Content-Disposition: form-data; name=""ctl00$MainContent$fname""
jim
--{0}
Content-Disposition: form-data; name=""ctl00$MainContent$lname""
bob
--{0}
Content-Disposition: form-data; name=""ctl00$MainContent$picUpload""; filename=""C:\temp\small.JPG""
Content-Type: image/jpeg
", boundry);
string endData = string.Format(@"
--{0}
Content-Disposition: form-data; name=""ctl00$MainContent$post""
--{0}--
", boundry);
List<byte> postByteArray = Encoding.UTF8.GetBytes(postData).ToList();
byte[] file = File.ReadAllBytes(@"C:\temp\small.JPG");
postByteArray.AddRange(file);
postByteArray.AddRange(Encoding.UTF8.GetBytes(endData));
client.Headers.Add("Content-Type", contentType);
client.UploadData("http://localhost:63247/Default.aspx", "POST", postByteArray.ToArray());
}
HttpWebRequest のより簡単な代替手段はWebClientクラスです。名前と値のペアをアップロードするには:
using (var c = new WebClient())
{
var values = new NameValueCollection();
values.Add("key1", "value1");
c.UploadValues("http://www.acme.org/", "POST", values);
}