微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 通过Web Api接收,发送文件

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

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

我认为它被包裹或以某种方式操纵,我不确定如何正确地接收它.下面包含WebAPI服务的代码调用Web服务的方法

在,WebApi服务,当我点击该行返回Ok(bufferResult)时,该文件一个字节[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的新手,所以我可能会遗漏一些非常明显的东西.为什么文件流的大小不同? (例如,它是否被包裹,如何打开和/或接收流)

解决方法

好的,要正确接收文件,我需要更换线路
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);  
}*/

原文地址:https://www.jb51.cc/aspnet/248608.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐