Ajax AsyncFileUpload.FileBytes возвращает ноль - PullRequest
0 голосов
/ 25 января 2010

У меня есть страница загрузки файла с элементом управления 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 ]

2 голосов
/ 08 февраля 2010

Я думаю, что нашел решение этой проблемы: в событии OnUploadComplete просто вставьте в сеанс FileBytes и извлеките его в событие Button_Click. По какой-то причине байты загруженного файла стираются из сеанса после второй обратной передачи ...

Это работает для меня. ура Laurent

2 голосов
/ 06 октября 2011

Когда вы используете 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) решила проблему.

2 голосов
/ 25 января 2010

Я не совсем уверен, но я могу себе представить, что максимальный размер байтов в FileBytes ограничен из-за того, что многие загрузки файлов занимают много оперативной памяти. Ваш хостинг-партнер может ограничить это. Вероятно, ваш хостер установил <httpRuntime maxRequestLength="XXX" /> на 512 КБ по умолчанию.

Попробуйте сохранить файл с помощью SaveAs(path). Это в основном то, что вы делаете в данный момент, но вы дадите элементу управления выяснить, когда записывать файл, избегая загрузки всего файла в память, или захватить поток файлов, используя FileContent, если вам действительно нужен доступ сырое содержание. Также измените <httpRuntime maxRequestLength="XXX" /> на что-то вроде 102400, чтобы переопределить настройки по умолчанию вашего хостера.

...