使用POST方法和参数的BackgroundTransferService

6

我想通过BackgroundTransferService将一个文件(VideoFile)上传到服务器。

我的问题是,我还想在文件上传时发送2个参数(POST请求)。

那么,在使用BackgroundTransferService API时,是否可以同时发送参数和文件上传?

包含BackgroundTransferService的代码:

        BackgroundTransferRequest req = new BackgroundTransferRequest(new Uri("ServerURL", UriKind.Absolute));
        req.Method = "POST";
        req.TransferPreferences = TransferPreferences.AllowCellularAndBattery;

        string uploadLocationPath = "/Shared/Transfers/myVideoFile.mp4";
        string downloadLocationPath = "/Shared/Transfers/response.txt";

        req.UploadLocation = new Uri(uploadLocationPath, UriKind.Relative);
        req.DownloadLocation = new Uri(downloadLocationPath, UriKind.Relative);

        req.TransferProgressChanged += req_TransferProgressChanged;
        req.TransferStatusChanged += req_TransferStatusChanged;

        try
        {
            BackgroundTransferService.Add(req);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unable to add video to upload queue.\nPlease try again later.", App.appName, MessageBoxButton.OK);
        }

如果有人需要更多信息并且无法理解我的问题,请询问。

我希望能尽快得到回复。是或否,如果是的话,请告诉我如何操作?

2个回答

2

几周前我遇到了类似的问题。我通过 HttpClient 成功地完成了文件上传。

请检查代码。

        HttpClient client = new HttpClient();
        StorageFile file = null; // assign your file here

        MultipartFormDataContent formdata = new MultipartFormDataContent();
        formdata.Add(new StringContent("value"), "key");
        formdata.Add(new StreamContent(await file.OpenStreamForReadAsync()), "file", "recordedVideoFile2.mp4");

        var response = await client.PostAsync(new Uri("URL here"), formdata);

谢谢您的回复,但我想在“后台”上传文件,所以我猜我必须使用“BackgroundTransferService”。 - Keval Langalia
我建议将你的方法标记为“async”,并简单地调用此方法来启动后台进程。不再需要使用“BackgroundTransferService”。 - Florian Moser
@FlorianMoser 感谢您的建议,但我必须使用 BackgroundTransferService 的原因是我还想追踪已上传的字节数和剩余的字节数。只有通过使用 BackgroundTransferService 才能跟踪这些统计数据,而不能通过 HttpClient 实现。是否有其他替代方案呢? - Keval Langalia
1
看起来HttpClient也可以做到这一点:https://dev59.com/v2Ei5IYBdhLWcg3wjs1j - Florian Moser
听起来很不错!我正在尝试将其应用到我的情况中,让我们看看它是否有效。我很快会在这里提到的! - Keval Langalia
很遗憾,我必须使用HttpClient并通过POST请求完成上传(有一些限制)。@FlorianMoser感谢您提供的参考链接。那帮助我解决了我的另一个问题。@learner感谢您提出的替代方案。 - Keval Langalia

1
我不完全确定你想要做什么。但是,我认为你可以通过HTTP标头来实现。
BackgroundTransferRequest.Headers 属性 https://msdn.microsoft.com/zh-cn/library/windows/apps/microsoft.phone.backgroundtransfer.backgroundtransferrequest.headers(v=vs.105).aspx 并且作为带有 Tag 属性的发送者。 https://msdn.microsoft.com/zh-cn/library/windows/apps/microsoft.phone.backgroundtransfer.backgroundtransferrequest.tag(v=vs.105).aspx 这个属性可以用于关联与传输相关的自定义数据。应用程序可以在创建传输请求时设置该值。当使用Requests属性或Find(String)方法检索传输请求时,Tag属性将包含先前设置的数据。此属性仅由调用应用程序使用,系统会忽略它。该属性的最大长度为4000个字符,但建议您保持数据大小较小,以提高性能。

我已经尝试过了,但是不行...它会出现“错误400:错误的请求”,并且无法成功完成。无论如何,还是谢谢你的建议。 - Keval Langalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接