Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >文件上传API端点在ASP.NET核心迁移后中断

文件上传API端点在ASP.NET核心迁移后中断
EN

Stack Overflow用户
提问于 2020-04-06 22:47:20
回答 1查看 434关注 0票数 0

我刚刚将ASP.NET WebAPI迁移到ASP.NET Core2.1(我也尝试了2.2)。它包含一个文件上传路由,它接收一个多部分请求,一个二进制文件,具有一个已知的密钥/名称。

我的问题是request.Form.Files集合是空的。二进制内容作为正常的表单值接收(解析时只显示奇怪的字符)。

我的理解是,客户的实现是错误的。然而,它们是移动应用程序,所以我必须保持向后兼容。这基本上是客户端发送文件的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var client = new HttpClient();
var content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(File.ReadAllBytes("someimage.jpg")), "file");
await client.PutAsync("https://myapi/api/document", content);

旧的ASP.NET实现像这样解析它(一些部分被删除了):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var provider = new MultipartMemoryStreamProvider();
await request.Content.ReadAsMultipartAsync(provider);

Stream file = null;
foreach (var contentPart in provider.Contents)
{
    if (partName.Equals("file", StringComparison.OrdinalIgnoreCase))
    {
        file = await contentPart.ReadAsStreamAsync();
    }
}

在ASP.NET核心中,文件/表单解析是内置的,MultipartMemoryStreamProvider不再存在,所以我实现了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public async Task<IActionResult> Put(IFormFileCollection files) // files is empty list
public async Task<IActionResult> Put(IFormFile file) // file is null

// ...

var formFile = request.Form.Files.GetFile("file"); 
// formFile is null
// requests.Form.Files is empty
Stream file = formFile.OpenReadStream();

该文件可以通过request.Form["file"]检索,但其内容显示为{����。不知道我能不能把它带回到我的二进制内容。

我尝试了这段代码,但文件后来无法打开。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fff = request.Form["file"];
using (var stream = System.IO.File.OpenWrite("out.jpg"))
using (StreamWriter sw = new StreamWriter(stream))
{
    sw.Write(fff);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 05:07:04

我能够通过使用MultipartReader而不是旧的MultipartMemoryStreamProvider来解决这个问题。微软文档和相应的GitHub样品提供了很多帮助。

这是我的最后代码的精简版本。它绝不是一个“常规文件上传”端点,如果您需要能够处理更多不同场景的东西,请参阅上面链接的示例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[DisableFormValueModelBinding]
public async Task<IActionResult> Put(CancellationToken cancellationToken)
{

Stream fileStream = null;

var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), new FormOptions().MultipartBoundaryLengthLimit);
var reader = new MultipartReader(boundary, Request.Body);

var section = await reader.ReadNextSectionAsync();

while (section != null)
{
    var hasContentDispositionHeader =
        ContentDispositionHeaderValue.TryParse(
            section.ContentDisposition, out var contentDisposition);

    if (hasContentDispositionHeader)
    {
        if (contentDisposition.Name.Equals("file", StringComparison.OrdinalIgnoreCase))
        {
            fileStream = new MemoryStream();
            await section.Body.CopyToAsync(fileStream);
            fileStream.Position = 0;
        }
    }
    section = await reader.ReadNextSectionAsync();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var factories = context.ValueProviderFactories;
            factories.RemoveType<FormValueProviderFactory>();
            factories.RemoveType<JQueryFormValueProviderFactory>();
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61074266

复制
相关文章
用Python进行单元测试
Python编程语言,不仅仅在机器学习、数据分析等领域大放异彩,在web开发中等软件开发中,使用者也越来越多。
老齐
2021/04/19
3.2K0
用Python进行单元测试
对 React 组件进行单元测试
前端开发的一个特点是更多的会涉及用户界面,当开发规模达到一定程度时,几乎注定了其复杂度会成倍的增长。
江米小枣
2020/06/16
4.3K0
用MockMvc对Spring mvc中的controller层进行单元测试
参考:http://sishuok.com/forum/posts/list/7981.html  ;  http://www.tuicool.com/articles/6nqeIbm
克虏伯
2019/04/15
2.6K0
[译] 对 Vue-Router 进行单元测试
原文:https://medium.com/js-dojo/unit-testing-vue-router-1d091241312
江米小枣
2020/06/15
2.2K0
如何对机器学习代码进行单元测试?
本文介绍了一种用于机器学习代码的单元测试方法,通过生成数据输入、模型推理、损失计算和优化等步骤,来确保每个组件只在一个步骤中起作用。作者还提供了相应的测试用例和代码示例,以帮助读者更好地理解单元测试的实现过程。同时,作者也提醒读者,单元测试并非万能的,需要结合其他测试方法来全面评估机器学习代码的性能和正确性。
企鹅号小编
2018/01/09
2.5K0
如何对机器学习代码进行单元测试?
如何对 Jenkins 共享库进行单元测试
Jenkins 共享库是除了 Jenkins 插件外,另一种扩展 Jenkins 流水线的技术。通过它,可以轻松地自定义步骤,还可以对现有的流水线逻辑进行一定程度的抽象与封装。至于如何写及如何使用它,读者朋友可以移步附录中的官方文档。
LinuxSuRen
2019/05/29
2.2K0
ASP.NET Core 对Controller进行单元测试
单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试有所了解,比如如何mock一个接口。在这里多叨叨一句,面向接口的好处,除了能够快速的替换实现类(其实大部分接口不会有多个实现),最大的好处就是可以进行mock,可以进行单元测试。
MJ.Zhou
2020/06/23
2K0
对 WordPress 主题进行单元测试(Theme Unit Test)
在制作 WordPress 的过程中,除了对整体的结构等进行排版布局等,还必须要对正文的内容和其他地方进行修饰和排版,例如正文中可能出现的 标题(h2、h3)、列表(ul、ol)、表格(table) 以及不同的文章类型效果等等。这就是 WordPress 主题的单元测试(Theme Unit Test)。
Denis
2023/04/15
1.9K0
用程序对hdfs进行操作。
调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中执行的。
用户5166556
2019/04/16
4620
用QUnit对Razor进行测试
Given how central JavaScript is to many modern web applications,  it is important to use unit tests to drive the design and quality of that JavaScript. But I’ve noticed that there are a lot of developers that don’t know where to start.
javascript.shop
2019/09/04
6350
用QUnit对Razor进行测试
如何对Spring MVC中的Controller进行单元测试
对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试。 具体来讲,是由Spring框架中的spring-test模块提供的实现,详见MockMvc。
编程随笔
2022/04/29
2.3K0
用LogParser对IIS 日志进行分析
LogParser 是一个命令行工具,可以通过SQL 语句对日志进行分析统计,LogParser功能非常的强大,不但可以分析IIS日志,还可以分析系统事件日志,CSV,XML等格式日志,同时LogParser还支持编程接口,LogParser的帮助文档里自带了一个使用C#查询系统日志的例子。下面给出LogParser的下载地址。 基本的用法如下: LogParser –i:输入文件的格式 –o:输出格式 “SQL语句” 例如下面的例子是用Log Parser统计访问整个IIS站点的IP,及访问次数: log
张善友
2018/01/30
1.9K0
如何对类中的protected方法进行单元测试
也许很多同学写单元测试时遇到这样的问题,一个类方法是 protected ,如何测呢 ? 当然,你可以说把 protected 改成 public 就可测了!没错,是可测了,可是 ......
跑马溜溜的球
2020/12/07
4K0
用Prometheus对业务服务进行监控
这里分享一个用于黑盒监控的blackbox_exporter, 可以用于对http,https,tcp,dns以及ICMP协议进行探测,从而抓取数据进行监控。但是,这些对于我们来说究竟能解决什么用处。
公众号: 云原生生态圈
2021/11/15
1.7K0
用Prometheus对业务服务进行监控
用ranger对hive metastore 进行授权管理
hive standalone metastore 3.1.2可作为独立服务,作为spark、flink、presto等服务的元数据管理中心,然而在现有的hive授权方案中只有针对hiveserver2的授权,所以本文针对hive standalone metastore独立服务使用ranger对连接到hive metastore的用户进行授权访问,以解决hive standalone metastore无权限验证问题。
从大数据到人工智能
2022/01/15
1.8K0
用ranger对hive metastore 进行授权管理
用Python对MySQL同步状态进行监
使用Python对MySQL数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情。感谢Python给我们带来了如此简单,强大,快捷的开发环境。
py3study
2020/01/08
9700
点击加载更多

相似问题

用Jest对EventEmitter进行单元测试

13

用MrUnit对作业进行单元测试

12

用ICommand对NSubstitute进行单元测试

11

用超时对HttpClient进行单元测试

10

用Rebus对CorrelationId进行单元测试

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文