2013-02-18 2 views
3

Я внедрил службу POST Rest для загрузки файлов на свой сервер. проблема, которую я имею прямо сейчас, заключается в том, что я хочу ограничить загруженные файлы по типу. скажем, например, я хочу только разрешить загрузку файлов .pdf.Имя файла из HttpRequestMessage Содержимое

То, что я пытался сделать,

  Task<Stream> task = this.Request.Content.ReadAsStreamAsync(); 
      task.Wait(); 
      FileStream requestStream = (FileStream)task.Result; 

, но, к сожалению, его не представляется возможным, чтобы бросить поток к FileStream и доступ к типу с помощью requestStream.Name.

есть простой способ (кроме записи потока на диск и проверки типа), чтобы получить тип файла?

ответ

7

Если вы загружаете файл в веб-API и хотите получить доступ к данным файла (Content-Disposition), вы должны загрузить файл как MIME multipart (multipart/form-data).

Here Я показал несколько примеров того, как загрузить из HTML-формы, Javascript и .NET.

Вы можете сделать что-то вроде этого, этот пример проверяет только PDF/DOC файлов:

public async Task<HttpResponseMessage> Post() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, 
                    "This request is not properly formatted - not multipart.")); 
     } 

     var provider = new RestrictiveMultipartMemoryStreamProvider(); 

     //READ CONTENTS OF REQUEST TO MEMORY WITHOUT FLUSHING TO DISK 
     await Request.Content.ReadAsMultipartAsync(provider); 

     foreach (HttpContent ctnt in provider.Contents) 
     { 
      //now read individual part into STREAM 
      var stream = await ctnt.ReadAsStreamAsync(); 

      if (stream.Length != 0) 
      { 
       using (var ms = new MemoryStream()) 
       { 
        //do something with the file memorystream 
       } 
      } 
     } 
     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

public class RestrictiveMultipartMemoryStreamProvider : MultipartMemoryStreamProvider 
{ 
    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     var extensions = new[] {"pdf", "doc"}; 
     var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty); 

     if (filename.IndexOf('.') < 0) 
      return Stream.Null; 

     var extension = filename.Split('.').Last(); 

     return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase)) 
        ? base.GetStream(parent, headers) 
        : Stream.Null; 

    } 
} 
+0

BodyPartFileNames была изменена в выпуске RTM, теперь используют свойство FileData. –

Смежные вопросы