web-dev-qa-db-ja.com

コンテンツをアップロードするときのHTTPリクエスト内のContent-Type値は何ですか?

Http-traficからアップロードを抽出する必要があります。どうすればそれができますか?まず、request-methodはPOSTです。次に、Content-Typeヘッダーフィールドがあります。公式データを抽出したくないが、メール添付のようなアップロード。

20
user1826831

コンテンツタイプは 仕様ごと _multipart/form-data_です。

これは、1つの大きなリクエストで複数のサブリクエストとして視覚化できる特別なコンテンツタイプです。これらの各サブリクエスト(1つのフォームデータ要素)には、独自のヘッダーセットがあります。実際のデータのコンテンツタイプはそこにあります。

1つの通常フィールドと1つのファイルフィールド(_<input name="textfield"><input type="file" name="filefield">_を使用する場合のHTML用語)での表示例を次に示します。

_Content-Type: multipart/form-data;boundary=SOME_BOUNDARY

--SOME_BOUNDARY
content-disposition: form-data;name="textfield"
content-type: text/plain;charset=UTF-8

value of textfield here
--SOME_BOUNDARY
content-disposition: form-data;name="filefield";filename="some.ext"
content-type: application/octet-stream

binary file content here

--SOME_BOUNDARY--
_

このデータの解析と抽出に関しては、実質的にすべてのプログラミング言語にこのためのサードパーティAPIが組み込まれています。使用しているものについて何も言わなかったので、ターゲットを絞った答えを出すことは不可能です。たとえばJavaの場合は、サードパーティライブラリのApache Commons FileUploadか、Servlet 3.0を使用している場合は、APIが提供するrequest.getPart()メソッドです。

25
BalusC

@BalusCのソリューションに基づいて、WebClientクラスでの.NETビルド用の小さな拡張メソッドを作成しました。このメソッドは、すぐに使用できるマルチパートアップロードをサポートしていません。

使用法

文字列値とファイルを混在させるだけです(#で囲まれています)

    public void UploadMultipart()
    {
        var fileName = "/some/existing/file.ext";
        using (var client = new WebClient())
        {
            var values = new NameValueCollection();
            values.Add("id", Guid.NewGuid().ToString());
            values.Add("name", Path.GetFileNameWithoutExtension(fileName));
            values.Add("file", $"#{fileName}#");

            var result = client.UploadMultipart(address, method, values);
            var content = client.Encoding.GetString(result);
        }
    }

拡張方法

    public static byte[] UploadMultipart(this WebClient client,
        string address, string method, NameValueCollection values)
    {

        string boundary = DateTime.Now.Ticks.ToString("x");

        client.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);

        var sb = new StringBuilder()
            .AppendLine();

        foreach (var key in values.AllKeys)
        {
            var contentDispositon = $"form-data;name=\"{key}\"";
            var contentType = $"text/plain;charset={client.Encoding.WebName}";

            var value = values[key];

            if (value.StartsWith("#") && value.EndsWith("#"))
            {
                // if a value is enclosed in hashes we expect this to be a path to a file
                // file=#/path/to/file.ext#
                var fileName = value.Trim('#');
                var file = File.ReadAllBytes(fileName);
                value = client.Encoding.GetString(file);

                contentType = "application/octet-stream";
                contentDispositon = $"form-data;name=\"{key}\"filename=\"{Path.GetFileName(fileName)}\"";
            }

            sb.AppendLine($"--{boundary}")
              .AppendLine($"Content-Disposition: {contentDispositon}")
              .AppendLine($"Content-Type: {contentType}")
              .AppendLine()
              .AppendLine(value);
        }

        sb.AppendLine($"--{boundary}--");

        var data = client.Encoding.GetBytes(sb.ToString());

        return client.UploadData(address, method, data);

    }
0

バイト配列からデータを保存したいだけなら(これが正しい方法だとは決して言いません)、POST bodyの読み方: POST bottle.pyで本文 を読み込んでデータを読み込んでから新しいファイルを作成すると、うまくいくはずです。

0
Eaton Emmerich