当我使用httpclient发布以下代码时

using var formContent = new MultipartFormDataContent("NKdKd9Yk");
using var stream = new MemoryStream();
file.CopyTo(stream);
var fileBytes = stream.ToArray();
formContent.Headers.ContentType.MediaType = "multipart/form-data";
formContent.Add(new StreamContent(stream), "file", fileName);
var response = await httpClient.PostAsync(GetDocumentUpdateRelativeUrl(), formContent);

此文件的类型为IFormfile的类型为

在API端,我检索文件如下

var base64str= "";
using (var ms = new MemoryStream())
{
    request.file.CopyTo(ms);
    var fileBytes = ms.ToArray();
    base64str= Convert.ToBase64String(fileBytes);
    // act on the Base64 data
}

我得到0字节.我的问题是,这种方法有什么问题?

但如果我使用下面的代码.然后API工作了,我得到了我发布的内容.

using var formContent = new MultipartFormDataContent("NKdKd9Yk");
using var stream = new MemoryStream();
file.CopyTo(stream);
var fileBytes = stream.ToArray();
formContent.Headers.ContentType.MediaType = "multipart/form-data";
formContent.Add(new StreamContent(new MemoryStream(fileBytes)), "file", fileName);

不同之处在于我如何添加流内容

formContent.Add(new StreamContent(stream), "file", fileName);
vs
formContent.Add(new StreamContent(new MemoryStream(fileBytes)), "file", fileName);

为什么第一种方法不起作用,而第二种方法起作用?

推荐答案

你需要加stream.Seek(0, SeekOrigin.Begin);才能跳回MemoryStream的开头.你也应该使用CopyToAsync

在第二个版本中,byte[]数组中有一个新的MemoryStream,它位于0上.

using var formContent = new MultipartFormDataContent("NKdKd9Yk");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
formContent.Headers.ContentType.MediaType = "multipart/form-data";
formContent.Add(new StreamContent(stream), "file", fileName);
using var response = await httpClient.PostAsync(GetDocumentUpdateRelativeUrl(), formContent);

虽然说实话,MemoryStream在这里似乎完全没有必要.直接从file经过a Stream.

using var formContent = new MultipartFormDataContent("NKdKd9Yk");
formContent.Headers.ContentType.MediaType = "multipart/form-data";
using var stream = file.OpenReadStream();
formContent.Add(new StreamContent(stream), "file", fileName);
using var response = await httpClient.PostAsync(GetDocumentUpdateRelativeUrl(), formContent);

Csharp相关问答推荐

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

有没有办法把+02:00转换成TimeSpan?""

ASP.NET核心结果.文件vs结果.流

. NET Core DB vs JSON模型设计

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

Polly v8—使用PredicateBuilder重试特定的状态代码

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

如何使用C#Interop EXCEL创建度量衡

不带身份的Blazor服务器.Net 8 Cookie身份验证

将现有字段映射到EFCore中的复杂类型

在实体框架中处理通用实体&S变更跟踪器

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

该函数不能检测两条曲线的交点

MSTest--将消息直接写入StdOut和使用TestContext有什么不同?

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

如何将 colored颜色 转换为KnownColor名称?

C#如何替换两个XML元素值?