如何使用flurl在uwp中发布多部分/表单数据

如何使用flurl在uwp中发布多部分/表单数据,uwp,flurl,Uwp,Flurl,我正在uwp中使用flurl,希望将图像文件发布到服务器 服务器api需要一个参数“image_file”,一个二进制文件,需要使用多部分/表单数据进行post 现在我有了一个StorageFile,如何发布它 string res = ""; try { res = await _detect_api_url .PostMultipartAsync(mp => mp

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

服务器api需要一个参数“image_file”,一个二进制文件,需要使用多部分/表单数据进行post

现在我有了一个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;
        }
现在我有了一个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;
        }
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.path
属性直接获取它。请注意,您不能自己直接提供本地路径生成,您必须从
存储文件
对象获取它,有关详细信息请参考

以下是通过
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;
    }
}