作者:婧氏橙奂 | 来源:互联网 | 2023-05-26 10:51
我正在尝试使用类似方法上传文件HttpClient:如何
在Windows手机中一次上传多个文件.
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调用期间内存会呈指数级增长.似乎它正在将整个内容复制到内存中.现在我们在api中没有分块支持.
在低内存Windows手机设备中使用HttpClient上传大文件的最佳策略是什么?
1> Todd..:
手动执行多部分POST - 没有帮助 MultipartFormDataContent
如果你必须多部分发送它,那么你可以手动发布它,从4k缓冲区块中的源文件中读取.
您不一定需要使用异步方法.解决方案是"手动控制4k缓冲".但异步是理想的,是大多数线程/ CPU效率.
这是另一个推荐的链接,用于了解如何编写多部分帖子.另一个用于理解协议,这是一个通过流发送的内容的示例,说明边界标记
另外,在架构上,我更倾向于将文件分别上传到任何(表单)数据.这样可以完全避免多部分发布,使您的API具有原子性和简单性.您可能拥有一个简单存储上传文件并返回URL或ID的服务.然后,可以使用您的数据引用该URL或ID,然后发布.