2014-01-22 4 views
7

Я новичок в Web Api, и я работаю над своим первым проектом. Я работаю над мобильной системой CRM для нашей компании.Web Api 2 RESTFUL Загрузка изображения

Я хочу, чтобы хранить фирмы логотипа, клиенты сталкиваются с фото и т.д.

Я нашел некоторые учебники по этой теме, но, к сожалению, некоторые из них были старым (не используют асинхра), а остальные не работают.

В конце я нашел этот: http://www.intstrings.com/ramivemula/articles/file-upload-using-multipartformdatastreamprovider-in-asp-net-webapi/ Он работает правильно, но я не понимаю нескольких вещей.

1) Должен ли я использовать App_Data (или любую другую папку, например/Uploads) для хранения этих изображений, или, скорее, хранить изображения в базе данных?

2) Могу ли я установить только поддерживаемые изображения, такие как .jpg, .png и отклонить любые другие файлы?

3) Как я могу обработать изображение в методе загрузки? Как изменить размер, уменьшить размер файла, качество и т. Д.?

Спасибо

ответ

1

Ни один из вопросов не связан с веб-API или REST.

  1. Если вы используете SQL Server 2008 или новее, то для ответа используются столбцы FILESTREAM. Это похоже на столбец в базе данных со всеми его преимуществами (например, резервное копирование, репликация, транзакции), но данные фактически хранятся в файловой системе. Таким образом, вы получаете лучшее из каждого мира, т. Е. Не произойдет, что кто-то случайно удалит файл, поэтому база данных будет ссылаться на несуществующий файл, или наоборот, записи из базы данных удаляются, но файлы не так, что вы получите кучу сиротские файлы. Использование базы данных имеет много преимуществ, т. Е. Метаданные могут быть связаны с файлами, а разрешения легче настраивать.
  2. Это зависит от того, как файлы загружаются. То есть если вы используете многочастные формы, тогда изучите тип содержимого каждой части перед сохранением ее части. Вы даже можете создать свой собственный класс MultipartStreamProvider. Будучи API, возможно, метод upload имеет параметр потока или байтового массива и параметр типа содержимого, в этом случае просто проверьте значение параметра типа контента до сохранения содержимого. Для других методов загрузки сделайте что-то подобное в зависимости от того, что такое вход.
  3. Вы можете использовать встроенные классы .Net (то есть Bitmap: SetResolution, RotateFlip, для изменения размера используйте конструктор, который принимает размер), или если вы не знакомы с обработкой изображений, скорее выберите библиотеку обработки изображений.

Все вышеперечисленное работает в ASP.NET, MVC, Web API 1 и 2, пользовательских обработчиках HTTP, в основном в любом .Net-коде.

5

1) Мы хранение файлов в другом месте, чем App_Data. У нас есть несколько групп клиентов, и мы предоставили им уникальную папку, которую мы получаем из базы данных. Сохранение в базе данных также является опцией, но если вы идете по этой дороге, убедитесь, что файлы, которые вы сохраняете, не принадлежат непосредственно таблице, которую вам нужно часто извлекать. Нет никакого правильного или неправильного, но читайте на this question and answer для некоторых за и против.

2) Если вы foollowed, что руководство, вы можете поставить галочку внутри цикла, чтобы проверить файл, заканчивающийся

List<string> denyList = new List<string>(); 
denyList.Add(".jpg"); 

foreach (MultipartFileData file in provider.FileData) 
{ 
    string fileName = Path.GetFileName(file.LocalFileName); 
    if(denyList.Contains(Path.GetExtension(fileName)) 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

    files.Add(Path.GetFileName(file.LocalFileName)); 
} 

3) Изменение размера изображения является то, что я никогда лично сделал мой сам, но я думаю, вы должны взглянуть на пространство имен System.Drawing.Graphics. Найденых с ссылкой на реквизиты для ответа: ASP.Net MVC Image Upload Resizing by downscaling or padding

+0

Привет, благодарю вас за ответ. Вы ответили на большинство моих вопросов :) К сожалению, есть еще один вопрос о вашем размещенном коде. Вы используете поставщика foreach. Но когда вы загружаете данные у поставщика, файл уже сохраняется на сервере. Поэтому, если это неподдерживаемый формат, вы отправляете сообщение об ошибке, но файлы сохраняются на сервере. – Sandak

+0

Привет, Сандак. Просто прочитайте код с сайта, который вы связали, и он выглядел как файлы .Add - это часть, в которой файл был сохранен, но, как вы упомянули, будет рекомендовано выбросить ошибку перед сохранением файла. Возможно, вам придется изучить Request.Content перед созданием и чтением данных в провайдере, чтобы избежать сохранения файла. – Binke

-2

@Binke Никогда не выполняйте строковые операции пользователя на дорожках. То есть fileName.split ('.') [1] не будет возвращать расширение, если имя файла выглядит следующим образом: some.file.txt, и будет с ошибкой индекса за пределами диапазона, если файл не имеет расширения. Всегда используйте API файлов, т. Е. Path.GetExtension.

Кроме того, использование расширения для получения типа контента небезопасно, особенно при использовании изображений и видео, просто подумайте о расширении avi, что используется многими видеоформатами.

files.Add (Path.GetFileName (file.LocalFileName)) должен быть files.Add (fileName).

+1

Хотя это правда, кажется, ответ на другой вопрос .... – noelicus

+0

@noelicus Вероятно, вы забыли, что новым пользователям не разрешается комментировать, пока они не получат определенную репутацию, их единственный вариант - ответить. – user3285954

+0

Возможно, вы забыли, что можете удалять ответы, когда понимаете, что они не актуальны. :-D – noelicus

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