Web API将文件数据作为参数传递

时间:2018-03-19 20:08:23

标签: javascript .net asp.net-web-api

"正常"在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.readAsBinaryStringFileReader.readAsDataURLFileReader.readAsTextSystem.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}}。

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]);
}