热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在低内存Windows手机设备中使用HttpClient上传大文件的最佳策略是什么?》经验,为你挑选了1个好方法。

我正在尝试使用类似方法上传文件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,然后发布.


推荐阅读
author-avatar
婧氏橙奂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有