.net - HttpClient、PostAsync、文件上传、文件正文添加边界
问题描述
我是论坛的新手,所以不能直接添加图片。我也不允许添加标签“PostAsync”或“MultipartFormDataContent”。希望网址的工作和帖子有意义!
我在 .NET 控制台应用程序中使用 HttpClient 将文件发布到外部 Web 服务。目前我正在使用一个看起来像这样的虚拟文档(.txt): 原始文档
POST 工作并上传文档,但它已将边界、内容处置和内容类型附加到文档文本: 发布后的文档
代码如下所示:
如果我查看 RequestMessage->Content 标题对我来说看起来不错:Content Header
我的问题是:这与我的 POST 有关,还是与 Web 服务如何处理/接收请求有关?我尝试了 4 种不同的“变体”(几乎完全相同)来执行此 POST,结果相同。我还尝试从边界中删除引号:
var boundaryValue = content.Headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary");
boundaryValue.Value = boundaryValue.Value.Replace("\"", String.Empty);
任何输入表示赞赏,这一直困扰着我一段时间:)
编辑
string filePath = @"C:\Development\Customer\PKH\Documaster\TestFileToUpload.txt";
// we need to send a request with multipart/form-data
var content = new MultipartFormDataContent();
var fileContent = new StreamContent(File.OpenRead(filePath));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"files\"",
FileName = "\"" + Path.GetFileName(filePath) + "\""
};
fileContent.Headers.ContentType = new MediaTypeHeaderValue("plain/text");
content.Add(fileContent);
//Create uri
var builder = new UriBuilder(httpClient.BaseAddress + "integration/hub/v1/upload-single-file");
var query = HttpUtility.ParseQueryString(builder.Query);
var fileName = Path.GetFileName(filePath);
query["file-name"] = fileName;
builder.Query = query.ToString();
string url = builder.ToString();
//Do post
try
{
HttpResponseMessage responseString = await httpClient.PostAsync(url, content);
var contents = await responseString.Content.ReadAsStringAsync();
JObject newDocument = JObject.Parse(contents);
return newDocument;
}
catch(Exception)
{
return null;
}
//Eivind
解决方案
没关系,我最后想出了这个:接收端期望得到一个八位字节流,而不是多格式/数据,所以我只需要将它作为 ByteArray 发送并指定 MediaTypeHeaderValue:
string filePath = @"C:\Development\Customer\PKH\Documaster\TestDocxToUpload.docx";
var filebytes = File.ReadAllBytes(filePath);
//Create uri
var builder = new UriBuilder(httpClient.BaseAddress + "integration/hub/v1/upload-single-file");
var query = HttpUtility.ParseQueryString(builder.Query);
var fileName = Path.GetFileName(filePath);
query["file-name"] = fileName;
builder.Query = query.ToString();
string url = builder.ToString();
//Do post
try
{
using (var content = new ByteArrayContent(filebytes))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
HttpResponseMessage responseString = await httpClient.PostAsync(url, content);
var contents = await responseString.Content.ReadAsStringAsync();
JObject newDocument = JObject.Parse(contents);
return newDocument;
}
}
catch(Exception)
{
return null;
}
//Eivind
推荐阅读
- email - 将调查中的电子邮件发送到odoo12中的电子邮件列表时重新加载错误
- python - python webdriver_manager chrome 自定义配置文件
- javascript - 如何在 App Center 崩溃报告中查看未缩小的 React Native JS 调用?
- javascript - 将 vue.js 应用程序中的本地脚本注入不同的组件
- python - 烧瓶形式 current_user NoneType
- node.js - 我如何使用 react js 进行支付 paytm 我已经在 spring boot 中构建了 api
- java - 比较 Spring Mysql 中的 2 个值
- mysql - 如何将所有表中数据库中的所有“id”列设置为自动增量?
- visual-studio-code - vscode vim 扩展不写真字符?
- javascript - 如何在 Vue js 上安装 ShareThis?