0

タイトルについては申し訳ありませんが、現時点では、より良いものを得るのに十分なほど創造的ではありません.

ファイルを xup.in にアップロードしようとしています (C# で小さな API を提供するため)。しかし、どういうわけか、リクエストは有効なものではありません。xup.in も Wireshark もそれを読み取ることができません。Post-Request は有効ですが、マルチパート フォーム データは有効ではありません。

リクエストは次の関数によって送信されます:
http://pastebin.com/AvwzxCLA (申し訳ありませんが、code タグは使用できません)

これは私がリクエストを作成する方法です: http://pastebin.com/btrg9xiZ

誰が私が間違っているのか教えてもらえますか?

4

1 に答える 1

0

Stab in the dark - 境界文字列には先頭--に が必要であり、メッセージの最後の行は次の形式にする必要があり--boundarystring--ます。ウィキペディアのMIME エントリには、メッセージがどのように表示されるかの良い例が含まれています。リクエストをファイルにダンプし、それが有効なマルチパート メッセージであることを確認することから始めましょう。

編集

使用しているメソッドではなく、 System.Net.WebClientフレームワークを実際に使用する必要があります。このすべての機能をカプセル化します。

MIME 本体の構造を変更することで、スクリプトからのアップロードに成功しました。必要ないのでパラメーターからを削除したことに注意してください。Content-Typeさらに、boundaryString が適切に形成されていることを確認しました。つまり、渡される文字列はboundaryString、先頭の--

私はこの関数に 2 つの役割を持たせました - Stream が の場合にのみサイズを計算しますnull

    public static long sendMultiPartReq(Stream req, string boundaryString, object[] files, object[] parameters)
    {
        String CRLF = "\r\n";
        byte[] b;
        long contentLength = 0;

        foreach (string[] file in files)
        {
            b = Encoding.UTF8.GetBytes(
                CRLF + "--" + boundaryString + CRLF +
                String.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + CRLF,
                    file[0], Path.GetFileName(file[1])) +
                "Content-Type: image/png" + CRLF + CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
            if (File.Exists(file[1]))
            {
                b = File.ReadAllBytes(file[1]);
                contentLength += b.LongLength;
                if (req != null) req.Write(b, 0, b.Length);
            }
            b = Encoding.UTF8.GetBytes(CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
        }
        foreach (string[] parameter in parameters)
        {
            b = Encoding.UTF8.GetBytes(
                "--" + boundaryString + CRLF +
                String.Format("Content-Disposition: form-data; name=\"{0}\"" + CRLF, parameter[0]) +
                CRLF + parameter[1] + CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
        }
        b = Encoding.UTF8.GetBytes("--" + boundaryString + "--" + CRLF);
        contentLength += b.LongLength;
        if (req != null) req.Write(b, 0, b.Length);
        return contentLength;
    }
于 2012-04-04T09:34:29.780 に答える