2014-03-04 1 views
6

WebApi 컨트롤러에 Zip 파일을 보내거나 그 반대의 경우도 마찬가지입니다. 문제는 내 WebApi가 json을 사용하여 데이터를 전송한다는 것입니다. zip 파일은 직렬화 가능하지 않으며 스트림도 있습니다. 문자열은 직렬화 가능합니다. 그러나 zip을 문자열로 변환하고 문자열을 보내는 것보다 다른 해결책이 있어야합니다. 그것은 단지 잘못된 것처럼 들립니다.ASP.NET WebApi에 zip 파일을 보내는 방법

이것이 어떻게 수행되는지 알고 싶습니다.

+3

바이너리를 사용해야하는 경우 왜 JSON 만 허용하도록 제한하겠습니까? WebApi는 멀티 파트 또는 로우 바이트 스트림을 통해 바이너리를 읽는 여러 가지 방법을 지원합니다. –

답변

4

업로드,

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에 대한 다운로드 파일을 내부 얻을 수있는 StreamContent으로, 간단한 HttpResponseMessage를 사용해보십시오 그 스트림은 다음과 같습니다.

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 양식을 보내야합니다.

+0

이 문제가 해결되었습니다. 감사! –

4

당신의 API 메소드가 HttpRequestMessage은 다음 당길 수 예상 경우 파일

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; 
} 
관련 문제