Вот моя задача:расширение Проверка файла перед загрузкой файла в asp.net Web API
Мне нужно загрузить immages к серверу с помощью Asp.Net Web API.
Мне нужно проверить расширение файла перед его загрузкой (я хочу разрешить загрузку только объектов).
Мне нужно получить файл как 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
старый?
Спасибо! Кажется, ничто не мешает мне переоценить. Вероятно, в первый раз, когда я пытался переопределить его, я сделал опечатку. Во всяком случае, может быть, этот кусочек кода будет полезен кому-либо еще. –