【问题标题】:How to send zip files to ASP.NET WebApi如何将 zip 文件发送到 ASP.NET WebApi
【发布时间】:2014-04-06 05:39:18
【问题描述】:

我想知道如何将 zip 文件发送到 WebApi 控制器,反之亦然。 问题是我的 WebApi 使用 json 来传输数据。 zip 文件不可序列化,也不是流。字符串将是可序列化的。但是除了将 zip 转换为字符串并发送字符串之外,还必须有其他解决方案。这听起来不对。

知道这是怎么做到的吗?

【问题讨论】:

  • 如果您需要使用二进制文件,为什么要限制自己只允许使用 JSON? WebApi 支持多种读取二进制文件的方式,通过多部分或原始字节流。

标签: c# asp.net json asp.net-web-api zip


【解决方案1】:

尝试使用一个简单的 HttpResponseMessage,里面有一个 StreamContent 来获取,下载文件

public HttpResponseMessage Get()
{
    var path = @"C:\Temp\file.zip";
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new FileStream(path, FileMode.Open);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = 
        new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                            {
                                FileName = "file.zip"
                            };
    return result;
}

对于 POST,上传文件

public Task<HttpResponseMessage> Post()
{
    HttpRequestMessage request = this.Request;
    if (!request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }


    var provider = new MultipartFormDataStreamProvider("C:\Temp");

    var task = request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(o =>
        {

            string file1 = provider.BodyPartFileNames.First().Value;
            // this is the file name on the server where the file was saved 

            return new HttpResponseMessage()
            {
                Content = new StringContent("File uploaded.")
            };
        }
    );
    return task;
}

【讨论】:

    【解决方案2】:

    如果您的 API 方法需要 HttpRequestMessage,那么您可以从中提取流:

    public HttpResponseMessage Put(HttpRequestMessage request)
    {
        var stream = GetStreamFromUploadedFile(request);
    
        // do something with the stream, then return something
    }
    
    private static Stream GetStreamFromUploadedFile(HttpRequestMessage request)
    {
        // Awaiting these tasks in the usual manner was deadlocking the thread for some reason.
        // So for now we're invoking a Task and explicitly creating a new thread.
        // See here: http://stackoverflow.com/q/15201255/328193
        IEnumerable<HttpContent> parts = null;
        Task.Factory
            .StartNew(() => parts = request.Content.ReadAsMultipartAsync().Result.Contents,
                            CancellationToken.None,
                            TaskCreationOptions.LongRunning,
                            TaskScheduler.Default)
            .Wait();
    
        Stream stream = null;
        Task.Factory
            .StartNew(() => stream = parts.First().ReadAsStreamAsync().Result,
                            CancellationToken.None,
                            TaskCreationOptions.LongRunning,
                            TaskScheduler.Default)
            .Wait();
        return stream;
    }
    

    当我使用enctype="multipart/form-data" 发布 HTTP 表单时,这对我有用。

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 2020-03-03
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多