Att ladda ner filen
ASP.NET har ett problem med att ladda ned filen...basiskt sett om du använder Response .WriteFile hela filen är bufferad i minnet innan dess "'" laddats ner - detta är inte bra för skalbarhet. För att komma runt den där svårigheten, ladda ner - så ser det ut som att filen laddas ned , bara laddade ner delar på samma gång . också kontrollerar att klienten är sammankopplad innan man skickar nästa chunk...
private void DownloadFile(Guid itemId)
{
//Where to start in the file
long startPos = 0;
//How big a chunk to download in each iteration
long chunkSize = 20480;
//Use the id to retreive the resource files details
using(SqlDataReader reader=SqlExtra.ExecuteReader("GetResource", itemId))
{
try
{
if(reader.Read())
{
//Get the file details we need to save a copy to the client
string fileExtension=reader["FileTypeExtension"].ToString();
string fileNameClient=reader["FileName"].ToString();
string fileNameServer=Server.MapPath(string.Format(@"Uploads/{0}{1}", itemId.ToString(), fileExtension));
FileInfo file=new FileInfo(fileNameServer);
//Only proceed with the download if the file physically exists
if (file.Exists)
{
//Setup the Response object to allow file downloads
Response.Clear();
Response.ContentType = "application/octet-stream";
//Attach the file to the response stream.
Response.AddHeader("Content-Disposition", string.Format("{0}{1}", "attachment; filename=", fileNameClient));
Response.AddHeader("Content-Length",file.Length.ToString());
long fileSize = file.Length;
try
{
while(startPos < file.Length)
{
if(Response.IsClientConnected)
{
//write the file to the client
if(startPos + chunkSize > fileSize)
{
chunkSize = fileSize - startPos;
}
Response.WriteFile(fileNameServer,startPos,chunkSize);
Response.Flush();
startPos += chunkSize;
}
else
{
break;
}
}
}
catch(Exception ex)
{
ExceptionManager.Publish(ex);
}
Response.End();
}
else
{
//display an error message
StatusMessage.Text=fileNameClient;
}
}
}
catch(Exception ex)
{
if(ex.GetType() != typeof(System.Threading.ThreadAbortException))
{
ExceptionManager.Publish(ex);
}
}
}
}
Förhoppningsvis finner du den användbar. flexibelt...hmm...
Finding related posts...