Загрузка файлов с помощью ASP.Net MVC - получить имя, но нет потока файлов, что я делаю неправильно?
У меня есть эта форма на мой взгляд:
<!-- Bug (extra 'i') right here-----------v -->
<!-- was: <form method="post" enctype="mulitipart/form-data" action="/Task/SaveFile"> -->
<form method="post" enctype="multipart/form-data" action="/Task/SaveFile">
<input type="file" id="FileBlob" name="FileBlob"/>
<input type="submit" value="Save"/>
<input type="button" value="Cancel" onclick="window.location.href='/'" />
</form>
И этот код в моем контроллере:
public ActionResult SaveFile( FormCollection forms )
{
bool errors = false;
//this field is never empty, it contains the selected filename
if ( string.IsNullOrEmpty( forms["FileBlob"] ) )
{
errors = true;
ModelState.AddModelError( "FileBlob", "Please upload a file" );
}
else
{
string sFileName = forms["FileBlob"];
var file = Request.Files["FileBlob"];
//'file' is always null, and Request.Files.Count is always 0 ???
if ( file != null )
{
byte[] buf = new byte[file.ContentLength];
file.InputStream.Read( buf, 0, file.ContentLength );
//do stuff with the bytes
}
else
{
errors = true;
ModelState.AddModelError( "FileBlob", "Please upload a file" );
}
}
if ( errors )
{
return ShowTheFormAgainResult();
}
else
{
return View();
}
}
На основе каждого образца кода, который я смог найти, это похоже на способ сделать это. Я пробовал с небольшими и большими файлами, без каких-либо различий в результате. Поле формы всегда содержит имя файла, которое соответствует выбранному мной, и коллекция Request.Files всегда пуста.
Я не думаю, что это релевантно, но я использую VS Development Web Server. AFAIK поддерживает загрузку файлов так же, как IIS.
Это становится поздно, и есть шанс, что я пропущу что-то очевидное. Я был бы благодарен за любой совет.
Ответы
Ответ 1
Я не знаю, что такое политика при публикации ненормативной лексики, но здесь проблема:
enctype="mulitipart/form-data"
Дополнительный i
там остановил загрузку файла. Пришлось запустить Fiddler, чтобы увидеть, что он никогда не отправлял файл в первую очередь.
Он должен читать:
enctype="multipart/form-data"
Ответ 2
Для людей, которые могут наткнуться на этот пост в будущем, здесь отличный пост Скотта Гензельмана по теме: Обратно к основам Пример из практики: реализация Загрузка файла HTTP с помощью ASP.NET MVC, включая тесты и макеты.
Ответ 3
var file = Request.Files[sFileName];
должен быть...
var file = Request.Files["FileBlob"];
который сказал, Request.Files.Count
должен быть 1... hmmm
Ответ 4
Хорошо, что вы нашли свою ошибку.
В качестве побочной заметки вам понадобится try/catch для кода обработки файлов, чтобы вы знали, когда права доступа к файлам и т.д. не настроены правильно.