- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用类似的方法上传文件 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/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!