【问题标题】:Receive, send file over Web Api通过 Web Api 接收、发送文件
【发布时间】:2013-12-29 01:55:07
【问题描述】:

我正在尝试编写一个 WebApi 服务来接收文件,进行简单的操作,然后将文件发回。我在从服务发送和/或接收文件时遇到问题。

我遇到的问题是从服务返回的文件比操作文件大 1.5 倍,例如当文件被返回时,它就像 300kb 而不是应该的 200kb。

我假设它以某种方式被包装和/或操纵,我不确定如何正确接收它。下面是WebAPI服务的代码和调用Web服务的方法

在WebApi服务中,当我点击return Ok(bufferResult)这一行时,文件是byte[253312]

在调用web服务的方法中,文件被操作返回后,遵循var content = stream.Result;这一行,流的长度为337754字节。

Web API 服务代码

public ConversionController: APIController{
  public async Task<IHttpActionResult> TransformImage()
   {
    if (!Request.Content.IsMimeMultipartContent())
        throw new Exception();

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);

    var file = provider.Contents.First();
    var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
    var buffer = await file.ReadAsByteArrayAsync();
    var stream = new MemoryStream(buffer);

// [file manipulations omitted;]
    // [the result is populated into a MemoryStream named response ]

    //debug : save memory stream to disk to make sure tranformation is successfull
    /*response.Position  = 0;
      path = @"C:\temp\file.ext";
      using (var fileStream = System.IO.File.Create(path))
      {
        saveStream.CopyTo(fileStream);
      }*/


    var bufferResult = response.GetBuffer();
    return Ok(bufferResult);
   }
}

方法调用服务

public async Task<ActionResult> AsyncConvert()
    {

    var url = "http://localhost:49246/api/conversion/transformImage";   
var filepath = "drive/file/path.ext";
    HttpContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

    using (var client = new HttpClient())
    {
        using (var formData = new MultipartFormDataContent())
        {
            formData.Add(fileContent, "file", "fileName");

    //call service
            var response = client.PostAsync(url, formData).Result;

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception();
            }
            else
            {

                if (response.Content.GetType() != typeof(System.Net.Http.StreamContent))
                    throw new Exception();

                var stream = response.Content.ReadAsStreamAsync();
                var content = stream.Result;

                var path = @"drive\completed\name.ext";
                using (var fileStream = System.IO.File.Create(path))
                {
                    content.CopyTo(fileStream);  
                }
            }
        }


    }

    return null;
}

我对流和 WebApi 还很陌生,所以我可能遗漏了一些非常明显的东西。为什么文件流大小不同? (例如,它是否已包装以及如何打开和/或接收流)

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api filestream


    【解决方案1】:

    好的,要正确接收文件,我需要替换行

    var stream = response.Content.ReadAsStreamAsync();
    

    var contents = await response.Content.ReadAsAsync<Byte[]>();
    

    为绑定提供正确的类型

    所以,调用服务的方法的后面部分看起来像

    var content = await response.Content.ReadAsAsync<Byte[]>();
    var saveStream = new MemoryStream(content);
    saveStream.Position = 0;
    
    //Debug: save converted file to disk
    /*
    var path = @"drive\completed\name.ext";
    using (var fileStream = System.IO.File.Create(path))
    {
         saveStream.CopyTo(fileStream);  
    }*/
    

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2015-08-16
      • 2020-12-21
      • 2013-01-01
      相关资源
      最近更新 更多