5

HttpClient / HttpContent を使用してネットワーク経由でデータをアップロードしようとしていますが、この方法でファイルを送信する適切な方法が見つからないようです。

これが私の現在のコードです:

    private async Task<APIResponse> MakePostRequest(string RequestUrl, string Content)
    {
        HttpClient  httpClient = new HttpClient();
        HttpContent httpContent = new StringContent(Content);
        APIResponse serverReply = new APIResponse();

        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        try {
            Console.WriteLine("Sending Request: " + RequestUrl + Content);
            HttpResponseMessage response = await httpClient.PostAsync(RequestUrl, httpContent).ConfigureAwait(false);
        }
        catch (HttpRequestException hre)
        {
            Console.WriteLine("hre.Message");
        }
        return (serverReply);
    }

コンテンツは次の形式の文字列です: paramname=value¶m2name=value¶m3name=value.. ポイントは、このリクエストで実際にファイル (写真) を送信する必要があることです。

ファイル自体ではなく、各パラメーターに対して正常に機能しているようです(投稿リクエストで2つの認証キーを送信する必要があり、それらは認識されます)

この方法で画像を文字列として取得しますが、これが失敗する主な理由の 1 つである可能性があります。:/

    byte[] PictureData = File.ReadAllBytes(good_path);
    string encoded = Convert.ToBase64String(PictureData);

私は何か間違っていますか?適切な POST リクエストを作成する別のより良い方法はありますか (非同期で、ファイルのアップロードをサポートする必要があります)。

ありがとう。

4

2 に答える 2

9

主な問題は、おそらく文字列とファイルデータを混在させていたという事実から来ていました。

これで解決しました:

    public async Task<bool> CreateNewData (Data nData)
    {
        APIResponse serverReply;

        MultipartFormDataContent form = new MultipartFormDataContent ();

        form.Add (new StringContent (_partnerKey), "partnerKey");
        form.Add (new StringContent (UserData.Instance.key), "key");
        form.Add (new StringContent (nData.ToJson ()), "erList");

        if (nData._FileLocation != null) {
            string good_path = nData._FileLocation.Substring (7); // Dangerous
            byte[] PictureData = File.ReadAllBytes (good_path);
            HttpContent content = new ByteArrayContent (PictureData);
            content.Headers.Add ("Content-Type", "image/jpeg");
            form.Add (content, "picture_0", "picture_0");
        }

        form.Add (new StringContent (((int)(DateTime.Now.ToUniversalTime () -
            new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString ()), "time");
        serverReply = await MakePostRequest (_baseURL + "Data-report/create", form);

        if (serverReply.Status == SERVER_OK)
            return (true);
        Android.Util.Log.Error ("MyApplication", serverReply.Response);
        return (false);
    }

    private async Task<APIResponse> MakePostRequest (string RequestUrl, MultipartFormDataContent Content)
    {
        HttpClient httpClient = new HttpClient ();
        APIResponse serverReply = new APIResponse ();

        try {
            Console.WriteLine ("MyApplication - Sending Request");
            Android.Util.Log.Info ("MyApplication", " Sending Request");
            HttpResponseMessage response = await httpClient.PostAsync (RequestUrl, Content).ConfigureAwait (false);
            serverReply.Status = (int)response.StatusCode;
            serverReply.Response = await response.Content.ReadAsStringAsync ();
        } catch (HttpRequestException hre) {
            Android.Util.Log.Error ("MyApplication", hre.Message);
        }
        return (serverReply);
    }

主にマルチパート コンテンツを使用して、コンテンツ タイプを設定し、バイト配列を通過したようです。

于 2013-04-11T13:29:35.283 に答える
3

base64 でエンコードされた文字列としてデータを送信する必要がありますか? 任意のバイト (写真など) を送信する場合、次のByteArrayContentクラスを使用すると、エンコードせずに送信できます。

private async Task<APIResponse> MakePostRequest(string RequestUrl, byte[] Content)
{
    HttpClient  httpClient = new HttpClient();
    HttpContent httpContent = new ByteArrayContent(Content);
    APIResponse serverReply = new APIResponse();

    try {
        Console.WriteLine("Sending Request: " + RequestUrl + Content);
        HttpResponseMessage response = await httpClient.PostAsync(RequestUrl, httpContent).ConfigureAwait(false);
        // do something with the response, like setting properties on serverReply?
    }
    catch (HttpRequestException hre)
    {
        Console.WriteLine("hre.Message");
    }

    return (serverReply);
}
于 2013-03-29T17:17:06.050 に答える