Мне было предложено использовать FileResult, чтобы пользователи могли загружать файлы из моего приложения Asp.Net MVC. Но единственные примеры, которые я могу найти, всегда связаны с файлами изображений (указав тип содержимого image / jpeg).
Но что, если я не могу знать тип файла? Я хочу, чтобы пользователи могли загружать практически любые файлы из файловой области моего сайта.
Я прочитал один способ сделать это (см. Предыдущий пост для кода), который на самом деле работает нормально, за исключением одной вещи: имя файла, который появляется в диалоговом окне Сохранить как, объединяется из пути к файлу с подчеркиванием ( folder_folder_file.ext). Кроме того, кажется, что люди думают, что я должен вернуть FileResult вместо использования этого пользовательского класса, который я нашел BinaryContentResult.
Кто-нибудь знает «правильный» способ сделать такую загрузку в MVC?
РЕДАКТИРОВАТЬ: Я получил ответ (ниже), но просто подумал, что я должен опубликовать полный рабочий код, если кто-то заинтересован:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
источник
Response.ContentType = MimeMapping.GetMimeMapping(filePath);
, из stackoverflow.com/a/22231074/4573839Ответы:
Вы можете просто указать универсальный тип MIME для потока октетов:
источник
ReadAllBytes
был добавлен спустя годы в редактировании. Почему это мой второй самый голосующий ответ? Ну что ж.non-invocable member "File" cannot be used like a method.
Платформа MVC поддерживает это изначально. Контроллер System.Web.MVC.Controller.File предоставляет методы для возврата файла по имени / потоку / массиву. .
Например, используя виртуальный путь к файлу, вы можете сделать следующее.
источник
Если вы используете .NET Framework 4.5, используйте MimeMapping.GetMimeMapping (строка FileName), чтобы получить MIME-тип для вашего файла. Вот как я использовал это в своих действиях.
источник
У Фила Хаака есть хорошая статья, в которой он создал класс Результат загрузки файла с пользовательским файлом. Вам нужно только указать виртуальный путь к файлу и имя для сохранения.
Я использовал это один раз, и вот мой код.
В моем примере я сохранял физический путь к файлам, поэтому я использовал этот вспомогательный метод, который я нашел где-то, что я не могу вспомнить, чтобы преобразовать его в виртуальный путь
Вот полный класс, взятый из статьи Фила Хаака
источник
Server.MapPath(this.VirtualPath)
), поэтому непосредственное использование этого кода без изменений немного наивно. Вы должны создать альтернативу, которая принимает,PhysicalPath
учитывая, что это то, что в конечном итоге требуется и что вы храните. Это было бы намного безопаснее, если бы вы сделали предположение, что физический путь и относительный путь будут одинаковыми (исключая корень). Файлы данных часто хранятся в App_Data. Это не доступно как относительный путь.Спасибо Яну Генри !
В случае, если вам нужно получить файл с MS SQL Server, вот решение.
Где AppModel -
EntityFramework
модель, а MyFiles представляет таблицу в вашей базе данных. FileData находитсяvarbinary(MAX)
в таблице MyFiles .источник
это просто дать ваш физический путь в directoryPath с именем файла
источник
источник
if (string.IsNullOrWhiteSpace (fileName)) возвращает Content («имя файла отсутствует»);
источник
GetFile должен закрывать файл (или открывать его при использовании). Затем вы можете удалить файл после преобразования в байты - загрузка будет выполнена в этом байтовом буфере.
Так что в вашем методе загрузки ...
источник