Maison > Article > développement back-end > ASP.NET gère le problème du téléchargement de fichiers depuis le serveur
Cet article présente principalement le problème du téléchargement de fichiers depuis le serveur dans ASP.NET. Il a une très bonne valeur de référence. Examinons-le avec l'éditeur.
Supposons qu'il existe un nom. dans le répertoire racine du serveur. Il s'agit du dossier Download. Ce dossier stocke certains fichiers fournis en téléchargement par le programme de référence
public void DownloadFile(string path, string name){ try{ System.IO.FileInfo file = new System.IO.FileInfo(path); Response.Clear(); Response.Charset = "GB2312"; Response.ContentEncoding = System.Text.Encoding.UTF8; // 添加头信息,为"文件下载/另存为"对话框指定默认文件名 Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name)); // 添加头信息,指定文件大小,让浏览器能够显示下载进度 Response.AddHeader("Content-Length", file.Length.ToString()); // 指定返回的是一个不能被客户端读取的流,必须被下载 Response.ContentType = "application/ms-excel"; // 把文件流发送到客户端 Response.WriteFile(file.FullName); // 停止页面的执行 //Response.End(); HttpContext.Current.ApplicationInstance.CompleteRequest(); } catch (Exception ex){ Response.Write("<script>alert('系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.')</script>"); } }
Cette fonction est le programme de groupe de la fonction de téléchargement, où path est le chemin absolu du fichier (y compris le nom du fichier), name est le nom du fichier, et ce programme peut être exécuté si vous remplacez HttpContext.Current.ApplicationInstance.CompleteRequest(); avec Response.End();, l'erreur suivante apparaîtra : Exception : La valeur de l'expression ne peut pas être calculée car le code a été optimisé ou le framework natif est sur la pile d'appels. Cependant, cette erreur n'affectera pas le fonctionnement de. le programme, même si essayer peut détecter cette exception (je ne sais pas pourquoi)
J'ai trouvé quelques raisons à ce problème sur Internet : si vous utilisez la méthode Response.End, Response.Redirect ou Server.Transfer, une ThreadAbortException une exception se produira. Vous pouvez intercepter cette exception à l'aide d'une instruction try-catch. La méthode Response.End termine l'exécution de la page et bascule l'exécution vers l'événement Application_EndRequest dans le pipeline d'événements de l'application. Les lignes de code suivant Response.End ne sont pas exécutées. Ce problème se produit dans les méthodes Response.Redirect et Server.Transfer, car les deux méthodes appellent Response.End en interne.
Les solutions proposées sont :
Pour résoudre ce problème, utilisez l'une des méthodes suivantes :
Pour réponse .Fin , appelez la méthode HttpContext.Current.ApplicationInstance.CompleteRequest() au lieu de Response.End pour ignorer l'exécution du code pour l'événement Application_EndRequest.
Pour Response.Redirect, utilisez la surcharge Response.Redirect(String url, bool endResponse), qui passe false pour le paramètre endResponse afin d'annuler la réponse à Response. .Appel interne à .Fin. Par exemple :
Response.Redirect ("nextpage.aspx", false); catch (System.Threading.ThreadAbortException e){ throw; } 接下来就可以通过其他函数或者事件调用这个函数来下载服务器上的文件了 protected void btnOutput_Click(object sender, EventArgs e){ try{ string strPath = Server.MapPath("/") + "Download//学生基本信息模版.xls"; DownloadFile(strPath, "学生基本信息模版.xls"); } catch (Exception exp){ Response.Write("<script>alert('系统出现以下错误://n" + exp.Message + "!//n请尽快与管理员联系.')</script>"); } }
De cet événement, nous pouvons voir que le premier paramètre de la fonction DownloadFile est le chemin absolu du fichier, sinon le programme signalera une erreur.
Pour plus d'articles liés à l'implémentation ASP.NET du téléchargement de fichiers depuis le serveur, veuillez faire attention au site Web PHP chinois !