I have a file upload page with an AsyncFileUpload control. When the user browses to the file the upload control pulls the file into memory. I then have an Upload button which fires the following code to save the file to a database.
I am finding that if files are over about 500KB then the FileBytes property of the control simply returns null. This happens on my server but when running the app locally it runs through fine.
I'm not handling the OnUploadCompleted event as I need to user to complete further information before committing the file to database.
I have this in my web.config: httpRuntime maxRequestLength="10000"/>
开发者_JAVA技巧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.";
}
}
I am not totally sure, but I can imagine that the max bytes in FileBytes
is limited due to the fact that alot of file uploads would take up a lot of RAM. Your hostingpartner might have limited this. Probably your hoster has set the <httpRuntime maxRequestLength="XXX" />
to 512 KB by default.
Try saving the file using SaveAs(path)
. This is basically what you are doing at this point, but you'll let the control figure out when to flush to the file, avoiding taking the whole file in memory, or grab the filestream using FileContent
if you really need access to the raw content. Also change <httpRuntime maxRequestLength="XXX" />
to something like 102400
to override the default settings from your hoster.
I think I've found a fix for this problem : on the OnUploadComplete event, simply put in session the FileBytes, and retreive it in your Button_Click event. For some reason, your uploaded file bytes are erased from session after a second postback...
This works for me. Cheers Laurent
When you use AsyncFileUpload
you must set the right params in the form
tag, that is placed in your Page or MasterPage:
<form id="form1" runat="server" enctype="multipart/form-data" method="post">
If you don't set the right enctype and method UploadedComplete will never fire, and you won't be able to get FileUpload.FileBytes since FileUpload.HasFile returns true only during UploadedComplete execution.
I suppose that in your page you haven't set the right enctype.
Besides, prevoius versions of AsyncFileUpload didn't work on Chrome. 2011 July version (4.1.50731.0) solved the problem.
精彩评论