首页 > 编程语言 >C#使用HttpClient上传文件至阿里云oss失败的解决方案。

C#使用HttpClient上传文件至阿里云oss失败的解决方案。

时间:2024-06-03 10:45:32浏览次数:14  
标签:Encoding C# UTF8 oss var new boundary GetBytes HttpClient

The body of your POST request is not well-formed multipart/form-data在使用C#的HttpClient上传文件到阿里云oss的时候,根据postman生成的代码,但是用C#发起请求的时候会返回400错误以及错误信息 > The body of your POST request is not well-formed multipart/form-data

主要因为以下几个原因:

1. 在Http Header中Content-Type中,boundary需要不带双引号

2. 在Form中,每个Form的name值需要用双引号引起来

3. 如果文件表单域带有Content-TypeHeader,则该字段需要放在Content-Disposition字段后

4. 文件表单域在Content-Disposition中需要带有fileName

5. 文件表单域Content-Disposition不支持filename*=utf-8''%22a.txt%22这样的文件名表示

以下是解决后的代码

查看代码

var fileName = $"{storageData.Key}{Path.GetExtension(filePath)}";
var streamContent = new StreamContent(File.OpenRead(filePath));
var multipartForm = new MultipartFormDataContent($"-----{Guid.NewGuid()}")
{
    { new ByteArrayContent(Encoding.UTF8.GetBytes(storageData.AccessId)), "\"OSSAccessKeyId\"" },
    { new ByteArrayContent(Encoding.UTF8.GetBytes(fileName)), "\"Key\"" },
    { new ByteArrayContent(Encoding.UTF8.GetBytes(storageData.Policy)), "\"Policy\"" },
    { new ByteArrayContent(Encoding.UTF8.GetBytes("200")), "\"Success_action_status\"" },
    { new ByteArrayContent(Encoding.UTF8.GetBytes(storageData.Signature)), "\"Signature\"" },
    { streamContent, "\"file\"", $"\"{Path.GetFileName(filePath)}\"" }
};
var boundary = multipartForm.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
boundary.Value = boundary.Value.Replace("\"", string.Empty);
streamContent.Headers.ContentDisposition.FileNameStar = null;
var httpResponse = await HttpClient.PostAsync(url, multipartForm);
httpResponse.EnsureSuccessStatusCode();

标签:Encoding,C#,UTF8,oss,var,new,boundary,GetBytes,HttpClient
From: https://www.cnblogs.com/youngala/p/18228306

相关文章

  • python对excel文件中指定表格的指定列数据进行去重复操作。
    importpandasaspd#读取Excel文件df_all=pd.read_excel('域名管理系统.xlsx',sheet_name=None,engine='openpyxl')#确保'01流水'表存在if'01流水'indf_all:#提取第1列第2行至第1000行的数据并去重df_two=df_all['01流水']un......
  • iPhone网络抓包教程:运行tcpdump并在Wireshark进行网络抓包
    热烈欢迎,请直接点击!!!进入博主AppStore主页,下载使用各个作品!!!注:博主将坚持每月上线一个新app!! 1、安装Xcode,创建项目并连接至iPhone。2、iPhone连接至iMac,通过访达,获取iPhone的UDID。3、检查是否已安装rvictl。通常其随Xcode一起安装的:$whichrvictl/Library/Apple/usr/......
  • JavaScript 事件循环竟还能这样玩!
    JavaScript是一种单线程的编程语言,这意味着它一次只能执行一个任务。为了能够处理异步操作,JavaScript使用了一种称为事件循环(EventLoop)的机制。本文将深入探讨事件循环的工作原理,并展示如何基于这一原理实现一个更为准确的setTimeout、setInterval什么是事件循环?事件循环是......
  • Qt中怎么引用C语言的.c文件?
    Qt窗口项目使用的源文件是.h/.cpp文件,它们是对应C++文件。在实际应用中,你可能有现成的.h/.c文件需要引用。那么,这些文件能够引用吗?又怎么引用呢?以下来讨论这个问题。本例在ubuntu18中Qt5.8.0的Widgets项目编译通过,估计在CentOS和Windows系统也应该可以通过。一般情况下,通过宏“#......
  • Qt中怎么引用C语言的.h文件?
    Qt窗口项目使用的源文件是.h/.cpp文件,它们是对应C++文件。在实际应用中,你可能有现成的.h/.c文件需要引用。那么,这些文件能够引用吗?又怎么引用呢?以下来讨论这个问题。本例在ubuntu18中Qt5.8.0的Widgets项目编译通过,估计在CentOS和Windows系统也应该可以通过。本例要引用的.h文件......
  • Oracle系列---【ORA-00257: Archiver error. Connect AS SYSDBA only until resolved
    ORA-00257:Archivererror.ConnectASSYSDBAonlyuntilresolved1.问题描述过了个周末,发现系统登录不上了,查看日志,发现报"ORA-00257:Archivererror.ConnectASSYSDBAonlyuntilresolved",明显数据库有问题了,我用客户端连,也报这个错误。2.问题分析经过一番查询,是因......
  • Mac电脑在线视频播放器:IINA for Mac v1.3.4中文版下载
    IINA是一款优秀的Mac平台视频播放软件,能够支持几乎所有常见的视频格式和编解码器,包括4K、HEVC、H.264等。软件采用了现代化的设计风格,界面简洁清晰,操作简便。同时还支持视频播放过程中的画中画、自定义快捷键、在线字幕搜索等功能,用户体验非常优秀。除此之外,IINA还支持AirP......
  • ABB CI541V1 可控硅 控制器 模块
    ABBCI541V1控制器模块是一款专为工业自动化和控制应用而设计的高性能嵌入式卡件控制器。以下是关于该模块的详细信息和特点,按照要求进行了分点表示和归纳:基本信息型号与部件号:CI541V1,3BSE014666R1制造商:ABB技术规格处理器:配备高性能处理器,能够快速地执行复杂的控制算法和......
  • Honeywell CC-PFB401 控制器 电源模块系统备件
    HoneywellCC-PFB401控制器电源模块系统备件是一款专为工业自动化系统设计的备品备件。以下是关于该备件的详细信息和特点:基本信息品牌:Honeywell型号:CC-PFB401类型:控制器电源模块系统备件技术规格工作电压:24VDC输出频率:30Hz处理速度:15Hz程序容量:3MB数据容量:1MB认证......
  • 第一人称射击游戏:反恐精英(CS1.6) 支持win版和mac版下载
    枪战老玩家还记得这款史诗巨作吗?Macz为广大游戏玩家倾情推出反恐精英(CS1.6)forMac,CS1.6官方下载是由著名游戏《半条命》的其中一个游戏模组(MOD)衍生而成的游戏。逼真的画面,震撼的音效,3D的视角,多样的操作融合而成,挑战你的视觉感官。玩家可以见到多个游戏方式各不相同的......