【发布时间】:2018-08-28 12:28:12
【问题描述】:
在 Web API 中接受文件上传的“正常”方式是检查 Request.Content。但是,我想让文件数据成为该方法的实际参数,以便 NSwag 等工具能够生成正确的 TypeScript 客户端。
所以不要像这样:
[HttpPost]
public async Task UploadFile()
{
var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());
var result = await Request.Content.ReadAsMultipartAsync(provider);
var formData = result.FormData.GetValues("Path");
...
}
我只想要这样的东西:
public async Task UploadFileInfo(Models.FileInfo fileInfo)
{
//FileInfo contains a string of the binary data, decode it here
}
我有这部分工作,除了我不能可靠地将二进制文件数据编码为 JavaScript 中的字符串,然后将其解码以保存在 C#/.NET 中。
在 JavaScript 中,我尝试过 FileReader.readAsArrayBuffer、FileReader.readAsBinaryString、FileReader.readAsDataURL、FileReader.readAsText,但这些都没有生成可以可靠解码的二进制数据字符串。在 C# 中,我尝试过 System.Text.Encoding.UTF8.GetBytes 和/或 Convert.FromBase64String。
作为参考,NSwag 为与 Web API 通信而生成的相关代码如下:
const content_ = JSON.stringify(fileInfo);
let options_ : any = {
body: content_,
observe: "response",
responseType: "blob",
headers: new HttpHeaders({
"Content-Type": "application/json",
})
};
return this.http.request("post", url_, options_)
this.http 是一个 Angular HttpClient。
【问题讨论】:
-
您可以在 JavaScript 和 C# 中将文件 blob 转换为 base-64 编码的字符串。
-
在我们的应用程序中我们这样做了,但请注意与 base64 相关的大小“开销”
-
@Jasen 您可以发布显示客户端和 Web API 代码的代码吗?我尝试了一堆 FileReader 方法的组合,但无法让它工作。
-
@DotNetDev 同上。
-
明天上班时,我会检查我们的来源
标签: javascript .net asp.net-web-api