How to send zip files to ASP.NET WebApi

后端 未结 2 1247
死守一世寂寞
死守一世寂寞 2020-12-15 01:17

I\'m wondering how I can send a zip file to a WebApi controller and vice versa. The problem is that my WebApi uses json to transmit data. A zip file is not serializable, eit

相关标签:
2条回答
  • 2020-12-15 01:23

    Try using a simple HttpResponseMessage, with a StreamContent inside to GET, download file

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

    and for POST, upload file

    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;
    }
    
    0 讨论(0)
  • 2020-12-15 01:43

    If your API method expects an HttpRequestMessage then you can pull the stream from that:

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

    This works for me when posting an HTTP form with enctype="multipart/form-data".

    0 讨论(0)
提交回复
热议问题