1

我在 uwp 中使用 flurl,并希望将图像文件发布到服务器。

服务器 api 需要一个参数“image_file”,一个二进制文件,需要使用 multipart/form-data 发布。

现在我有一个 StorageFile,如何发布它?

string res = "";
        try
        {
            res = await _detect_api_url
                   .PostMultipartAsync(mp => mp
                   .AddStringParts(new { api_key = _api_key, api_secret = _api_secret, return_landmark = returnLandmarks, return_attributes = returnAttributes })
                   .AddFile("image_file", imageFile)
                   ).ReceiveString();
        }
        catch (FlurlHttpTimeoutException)
        {
            Debug.WriteLine("FlurlHttp internal time out.");
            res = "FlurlHttp internal time out.";
        }
        catch (FlurlHttpException ex)
        {
            Debug.WriteLine(ex.Message);
            res = ex.Call.ErrorResponseBody;
        }
4

1 回答 1

2

现在我有一个 StorageFile,如何发布它?

AddFile两种重载方法:

public CapturedMultipartContent AddFile(string name, Stream stream, string fileName, string mediaType = null, int bufferSize = 4096);
public CapturedMultipartContent AddFile(string name, string path, string mediaType = null, int bufferSize = 4096);

这样您就可以为将文件发布到服务器的方法提供文件流或文件本地路径。关于如何读取文件流StorageFile请参考这篇文章。而对于本地文件路径可以直接通过StorageFile.Path属性获取。注意不能直接提供自己构建的本地路径,必须从StorageFile对象中获取,具体请参考文件访问权限

以下是通过AddFile方法发布文件的示例代码。

string _detect_api_url = "http://localhost/BackgroundTransferSample/Upload.aspx";
private async void btntest_Click(object sender, RoutedEventArgs e)
{
    StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/picture0.png"));
    IBuffer buffer = await Windows.Storage.FileIO.ReadBufferAsync(imageFile);
    string res = "";
    try
    {
        //AddFile by file stream.
        res = await _detect_api_url
               .PostMultipartAsync(mp => mp
               .AddFile("image_file", buffer.AsStream(), "imagefile.png", null, (int)buffer.Length)
               ).ReceiveString();

        //AddFile by local file path.
        //res = await _detect_api_url
        //     .PostMultipartAsync(mp => mp
        //     .AddFile("image_file", imageFile.Path)
        //     ).ReceiveString();
    }
    catch (FlurlHttpTimeoutException)
    {
        Debug.WriteLine("FlurlHttp internal time out.");
        res = "FlurlHttp internal time out.";
    }
    catch (FlurlHttpException ex)
    {
        Debug.WriteLine(ex.Message);
        res = ex.Call.ErrorResponseBody;
    }
}
于 2017-09-25T08:13:55.973 回答