Ajax AsyncFileUpload.FileBytes возвращает ноль
У меня есть страница загрузки файла с элементом управления AsyncFileUpload. Когда пользователь просматривает файл, элемент управления загрузкой извлекает файл в память. Затем у меня есть кнопка Загрузить, которая запускает следующий код для сохранения файла в базе данных.
Я обнаружил, что если размер файла превышает 500 КБ, свойство FileBytes элемента управления просто возвращает значение NULL. Это происходит на моем сервере, но при локальном запуске приложения оно проходит нормально.
Я не обрабатываю событие OnUploadCompleted, так как мне нужно, чтобы пользователь выполнил дополнительную информацию перед передачей файла в базу данных.
У меня есть это в моем web.config: httpRuntime maxRequestLength="10000"/>
private void UploadDocument(int mietID)
{
if (Page.IsValid)
{
if (mietID > 0)
{
if (File1.HasFile && File1.FileBytes != null)
{
string[] docFormats = MIETPConfig.Current.SupportedDocumentFormats;
for (short i = 0; i < docFormats.Length; i++)
docFormats[i] = docFormats[i].ToUpper();
if (docFormats.Contains(Path.GetExtension(File1.FileName).ToUpper()))
{
try
{
byte[] uploadedBytes = File1.FileBytes;
DocumentController.CreateDocument(txtLinkText.Text, Path.GetFileName(File1.PostedFile.FileName), uploadedBytes, mietID, (User)Session["User"]);
MietpClientScripts.CloseWindow(Page);
}
catch (Exception)
{
lblUploadStatus.Text = "There was an error saving the document to the database.";
}
}
else
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (string s in docFormats)
sb.Append(s + ", ");
sb.Remove(sb.Length - 2, 2);
lblUploadStatus.Text = "Invalid file format, only these formats are supported: " + sb.ToString();
}
}
else
{
lblUploadStatus.Text = "There was an error saving the document, the document could not be read; it might be too large to upload.";
}
}
else
lblUploadStatus.Text = "No Mietp ID to associate document with.";
}
}
3 ответа
Я не совсем уверен, но я могу представить, что максимальное количество байтов в FileBytes
ограничен из-за того, что многие загрузки файлов занимают много оперативной памяти. Ваш хостинг-партнер может ограничить это. Возможно, ваш хостер установил <httpRuntime maxRequestLength="XXX" />
до 512 КБ по умолчанию.
Попробуйте сохранить файл, используя SaveAs(path)
, Это в основном то, что вы делаете в данный момент, но вы дадите элементу управления выяснить, когда необходимо выполнить сброс файла, избегая загрузки всего файла в память или захвата файлового потока, используя FileContent
если вам действительно нужен доступ к необработанному контенту. Также изменить <httpRuntime maxRequestLength="XXX" />
что-то вроде 102400
переопределить настройки по умолчанию от вашего хостера.
Я думаю, что нашел решение этой проблемы: для события OnUploadComplete просто вставьте в сеанс FileBytes и восстановите его в событии Button_Click. По какой-то причине байты загруженного файла стираются из сеанса после второй обратной передачи...
Это работает для меня. Ура Лоран
Когда вы используете AsyncFileUpload
Вы должны установить правильные параметры в form
тег, который размещен на вашей странице или главной странице:
<form id="form1" runat="server" enctype="multipart/form-data" method="post">
Если вы не укажете правильный enctype и метод UploadedComplete никогда не сработает, и вы не сможете получить FileUpload.FileBytes, так как FileUpload.HasFile возвращает true только во время выполнения UploadedComplete.
Я полагаю, что на вашей странице вы не указали правильный энтип.
Кроме того, предыдущие версии AsyncFileUpload не работали в Chrome. Июльская версия 2011 г. (4.1.50731.0) решила проблему.