2013-11-25 4 views
3

Вот моя задача:расширение Проверка файла перед загрузкой файла в asp.net Web API

  1. Мне нужно загрузить immages к серверу с помощью Asp.Net Web API.

  2. Мне нужно проверить расширение файла перед его загрузкой (я хочу разрешить загрузку только объектов).

  3. Мне нужно получить файл как Stream или Base64String, поскольку я хочу изменить его размер до сохранения на сервере.

Вот что я пробовал. Я могу загрузить файл на сервер, используя MultipartFormDataStreamProvider, и после того, как я унаследовал мой CustomMultipartFormDataStreamProvider от этого MultipartFormDataStreamProvider, я был в состоянии проверить расширение файла в методе GetStream как:

public override Stream GetStream(HttpContent parent, System.Net.Http.Headers.HttpContentHeaders headers) 
{    
    if (!String.IsNullOrEmpty(headers.ContentDisposition.FileName)) 
    { 
     var fileExtension = CommonUtils.GetFileExtension(headers.ContentDisposition.FileName); 
     if (_allowedExtensions != null && !_allowedExtensions.Contains(fileExtension.ToLower())) 
     { 
      return Stream.Null; 
     }  
    } 

    return base.GetStream(parent, headers); 
} 

Но MultipartFormDataStreamProvider сохраняет файл в указанную папку и не возвращать поток, и если я хочу изменить его размер, мне нужно прочитать его с HDD, изменить размер, сохранить как новый файл и удалить старый.

Другой вариант заключается в использовании MultipartMemoryStreamProvider - здесь я могу получить поток:

var task = Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()) 
      .ContinueWith<HttpResponseMessage>((tsk) => 
     { 
      MultipartMemoryStreamProvider provider = tsk.Result; 

      Stream stream = provider.Contents[0].ReadAsStreamAsync().Result; 
      String imageBase64 = Convert.ToBase64String(CommonUtils.StreamToByteArray(stream)); 
      ...... 
     } 

Но с MultipartMemoryStreamProvider я не знаю, как проверить расширение файла, как я не могу переопределить метод GetStream

Есть ли способ проверить расширение файла перед загрузкой файла и получить файл в виде потока вместо сохранения его на диск. Или единственный способ: save->resize->save new->delete старый?

ответ

4

Я не знаю, как проверить расширение файла, как я не могу переопределить метод GetStream

И почему это? Ничто не мешает вам перекрывая GetStream

Например:

public class ImageOnlyMultipartMemoryStreamProvider : MultipartMemoryStreamProvider 
{ 
    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 

     var fileExtension = CommonUtils.GetFileExtension(headers.ContentDisposition.FileName); 

     return _allowedExtensions == null || _allowedExtensions.Any(i => i.Equals(fileExtension , StringComparison.InvariantCultureIgnoreCase)) ? base.GetStream(parent, headers) : Stream.Null; 
    } 
} 
+0

Спасибо! Кажется, ничто не мешает мне переоценить. Вероятно, в первый раз, когда я пытался переопределить его, я сделал опечатку. Во всяком случае, может быть, этот кусочек кода будет полезен кому-либо еще. –

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