【问题标题】:Web API Pass File Data as ParameterWeb API 将文件数据作为参数传递
【发布时间】: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.readAsArrayBufferFileReader.readAsBinaryStringFileReader.readAsDataURLFileReader.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


【解决方案1】:

文件目录

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

【讨论】:

  • 你的new Base64Converter() 应该是Convert.FromBase64String() 吗?据我所知,.NET 没有一个名为 Base64Converter 的类。
  • 当我在 JavaScript 端使用 FileReader.readAsDataURL() 并在 .NET 端使用 Convert.FromBase64String() 时,我收到 The input is not a valid Base-64 string as it contains a non-base 64 character... 错误。所以那个方法行不通。
  • sry,是的,它不是 .NET 类,我会更新代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2011-07-06
相关资源
最近更新 更多