"正常"在Web API中接受文件上载的方法是检查 [HttpPost]
public async Task UploadFile()
{
var provider = new MultipartFormDataStreamProvider(Path.GetTempPath());
var result = await Request.Content.ReadAsMultipartAsync(provider);
var formData = result.FormData.GetValues("Path");
...
}
。但是,我希望将文件数据作为方法的实际参数,以便像NSwag这样的工具能够生成正确的TypeScript客户端。
所以不要这样的东西:
public async Task UploadFileInfo(Models.FileInfo fileInfo)
{
//FileInfo contains a string of the binary data, decode it here
}
我只想要这样的事情:
FileReader.readAsArrayBuffer
我有一部分工作,除了我不能将二进制文件数据可靠地编码为JavaScript中的字符串,然后对其进行解码以便在C#/ .NET中保存。
在JavaScript中,我们已经尝试过FileReader.readAsBinaryString
,FileReader.readAsDataURL
,FileReader.readAsText
,System.Text.Encoding.UTF8.GetBytes
,但这些都没有产生一串二进制数据,我可以可靠地解码。在C#中,我们尝试了Convert.FromBase64String
和/或 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_)
。
供参考,NSwag生成的与Web API通信的相关代码如下:
this.http
其中HttpClient
是Angular {{1}}。
答案 0 :(得分:0)
FileDto
[DataContract]
public class RestFileDataDto
{
[DataMember(Name = "data", IsRequired = true)]
[Required]
public string Data { get; set; }
[DataMember(Name = "filename")]
public string Filename { get; set; }
}
的Base64持久性
public void SaveFile(string data, string filePath)
{
var dir = Path.GetDirectoryName(filePath);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
using (FileStream outputStream = File.Create(filePath))
{
using (Stream inputStream = new MemoryStream(new Base64Converter().ConvertToByteArray(data)))
{
inputStream.Seek(0, SeekOrigin.Current);
inputStream.CopyTo(outputStream);
}
}
}
控制器
[HttpPut]
[Route("route")]
public HttpResponseMessage Upload([FromBody] RestFileDataDto fileImage)
{
//// call persistence
}
Base64Converter()。ConvertToByteArray
public byte[] ConvertToByteArray(string base64String)
{
var splittedString = base64String.Split(',');
return Convert.FromBase64String(splittedString[splittedString.Length - 1]);
}