gpt4 book ai didi

c# - 在低内存 Windows Phone 设备中使用 HttpClient 上传大文件的最佳策略是什么?

转载 作者:可可西里 更新时间:2023-11-01 09:08:54 26 4
gpt4 key购买 nike

我正在尝试使用类似的方法上传文件 HttpClient: How to upload multiple files at once 在 Windows Phone 中。

using (var content = new MultipartFormDataContent())
{
content.Add(CreateFileContent(imageStream, "image.jpg", "image/jpeg"));
content.Add(CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream"));

var response = await httpClient.PostAsync(_profileImageUploadUri, content);
response.EnsureSuccessStatusCode();
}

private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
{
var fileContent = new StreamContent(stream);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"files\"",
FileName = "\"" + fileName + "\""
}; // the extra quotes are key here
fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
return fileContent;
}

这在上传小文件时工作正常。如果我尝试在低端设备(512Mb 内存)中上传更大的文件(比如 > 50mb),它抛出 System.OutOfMemoryException。我使用诊断工具来监控内存消耗并注意到内存在 PostAsync 调用期间呈指数增长。好像是将全部内容复制到内存中。现在我们没有分块支持接口(interface)。

在低内存 Windows Phone 设备中使用 HttpClient 上传大文件的最佳策略是什么?

最佳答案

手动执行多部分 POST - 无需 MultipartFormDataContent

的帮助

如果你必须分批发送,那么你可以多发一次manually , 从 4k 缓冲 block 中的源文件中读取。

您不一定需要使用异步方法这样做。解决方案是“手动控制 4k 缓冲”。但异步是理想的,因为它是线程/CPU 效率最高的。

这是另一个推荐的链接,以了解如何 code multipart posts .另一个理解协议(protocol)的例子,这里是一个通过流发送的例子,illustrating the boundary markers

此外,在架构上,我倾向于将文件单独上传到任何(表单)数据。这完全避免了多部分发布,使您的 API 原子化且简单。您可能有一项服务可以简单地存储上传的文件并返回 URL 或 ID。该 URL 或 ID 可以与您的数据一起引用并随后发布。

关于c# - 在低内存 Windows Phone 设备中使用 HttpClient 上传大文件的最佳策略是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com