2017-10-02 2 views
1

zip 파일을 수신 그리고 나는 그런 요청에 우편 배달을 통해 테스트하기 위해 노력하고있어 : enter image description here enter image description hereC# 코어 1.1 웹 API 나는이</p> <pre><code>[HttpPut()] [Consumes("application/zip")] public async Task<IActionResult> ImportZip() { var zipFile = HttpContext.Request.Form.Files.FirstOrDefault(); .... </code></pre> <p>처럼 보이는 zip 파일을 받기 위해 웹 API 엔드 포인트를 작성

하지만 예외 "System.InvalidOperationException을 : 잘못된 내용 - 형식 : 응용 프로그램/우편 번호"지고있어 내가 잘못 무엇

를? 감사합니다. "HttpContext.Request.Form.Files.FirstOrDefault();"

EDIT 요청 사실 [소비된다 ("애플리케이션/ZIP")]을 통해 속성을 통과하지만에 충돌

EDIT2 좋아, 그래서 결국 나는 성공적으로 내가 요청 제거 [소비된다 ("응용 프로그램/우편 번호")] 속성에 어떤 헤더를 넣지 않은 파일을 받았다. Request.Form.Files에서 내 파일은 "응용 프로그램/X-ZIP 압축"형식을 가지고 있지만 내가 헤더 콘텐츠 유형과이 소비에 사용하기 위해 노력하고있어 때이 같은 충돌을 얻을 속성 System.InvalidOperationException: Incorrect Content-Type: application/x-zip-compressed

+0

콘텐츠 유형'application/zip'이 asp.net 핵심 응용 프로그램에 알려지지 않았으니까요. 나는 당신이 당신의 zip을'application/octet-stream'으로 업로드해야한다고 생각합니다. – NtFreX

+0

@NtFreX - System.InvalidOperationException : 올바르지 않은 Content-Type : application/octet-stream –

+0

우편 발송자의 본문 유형을 'binary'로 설정해야한다고 생각합니다. – NtFreX

답변

1

전송할 IFormFile을 사용할 수 있습니다 지퍼. 귀하의 WebApi 종점이 업데이트해야합니다

[HttpPut] 
[Consumes("multipart/form-data")] 
public void Put(IFormFile file) 
{ 
    var stream = file.OpenReadStream(); 
} 
는 이 같은 (이 요청에 해결됩니다과 같이 Content-Type 헤더가 필요하지 않습니다) 보일 것

이죠 요청 :

enter image description here

+1

고마워요, @Oluwafemi! 실제로 작동하고 있으며,이 접근법을 사용하여 이전처럼 요청에서 파일을 읽을 수 있습니다 ('HttpContext.Request.Form.Files.FirstOrDefault();'). 그러나 이해합니다 - 요청 된 모든 파일을 읽을 것이고 우편 번호에 대해서만 제한을두고 싶습니다 –

+0

해결책으로 내 대답을 표시해주십시오. 감사 – Oluwafemi

1

우체부는 것이다 multipart/form-dataContent-Type으로 보내십시오. 일반적으로 웹 API 동작이 여러 콘텐츠 형식을 지원해야하거나 특정 콘텐츠 형식을 지원하지 않을 때 Consumes 특성 만 지정합니다.

웹 API 동작이 HttpContext.Request.Form.Files에 따라 다르므로 Content-Typemultipart/form-data이어야합니다.

zip 파일 만 허용하는 가장 좋은 방법은 파싱을 시도하는 것입니다. 실패하면 잘못된 파일이 업로드되었음을 알게됩니다.

[HttpPut("api/import")] 
public IActionResult ImportZip() 
{ 
    var file = Request.Form.Files.FirstOrDefault(); 
    if (file == null) 
     return BadRequest(); 

    try 
    { 
     using (var zip = new ZipArchive(file.OpenReadStream())) 
     { 
      // do stuff with the zip file 
     } 
    } 
    catch 
    { 
     return BadRequest(); 
    } 

    return Ok(); 
} 

또 다른 옵션은 파일의 BOM (Byte order mark)을 확인하는 것입니다.