我有一个使用VB进行文件上传控制的简单ASP.NET网页。用户将上传一个.xls文件,并使用新格式和一些计算在项目目录中创建一个新的.xls文件。该文件保存,打开并显示,没有问题。使用Response.WriteFile下载包含网页内容的.xls文件
在此按钮单击事件中,我想要新创建的文件下载到用户的浏览器/下载文件夹。将Response.WriteFile与Response.End一起使用时,.xls文件可以正确下载......但是,在处理Response.WriteFile行之后,即使将它放入catch语句中,也会捕获线程中止异常并且不会收到任何异常(即我有一个标签,我想告诉用户,然后显示该文件已成功下载)。
这里的初始代码,主要作品:
Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click
If fuReport.HasFile Then
'All report processing occurs & report is created without issue
Try
Response.Clear()
Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", strReportName))
Response.ContentType = "application/vnd.ms-excel"
'Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.WriteFile(strReportName)
Response.End()
lblResult.Text = "Report was successfully downloaded."
Catch
lblResult.Text = "Testing1."
Finally
lblResult.Text = "Testing2."
fuReport = New FileUpload()
End Try
End If
End Sub
我见过的.xls文件将contentType一些不同的建议。上述两种内容类型都将下载该文件,但Catch或Finally语句中没有任何内容会被处理。 lblResult仍然显示“请稍候,正在处理您的报告...”
我在网上发现问题在于Response.End()。每https://support.microsoft.com/en-us/kb/312629/en-us,我将其替换为
HttpContext.Current.ApplicationInstance.CompleteRequest()
这引起了一个新问题。我的.xls文件会下载,但它似乎显示乱码,接着是一些aspx页面内容。在这里,标签即使在网页上没有改变,也能正确列出。我没有足够的声誉,包括截图,但是这是一些什么样的Excel文件显示的:
ˆdQ_9€`Èb/ecÈ¢l†=gÊC\Œ¬ÀxbY”Â…‘#ˆ,ör6ˆ,Ê…8ëY8ÖæBô?³2º‹CÓž€|^î¯{{<xJñ¯ªç2,FÑ+sbŸ£å›q³žcm"9ŸÛÆ…îâpoŸûñä_õ¥1K×Ê1Ü–‘äŒä‚$‹’,ÊÞÿ?ëY9ÖÎɺa 9†7(Æ‘E‰c<µŠ$wïå¼Q9çƒìù93vì£Þ¾ŠõXè.î·ÛúÏöX;`>¸w!‚™•ó‘#Ž,8²(ãÞqÖ3q¬M¥dÝ ‚Â7VE¾‰`|mä^@Y”°çÞÌØZXß²‹O•½në›×å=än½‘°i”EàqÅ^Ê6‹²(×›õìks žú¦¸Ð½µW§îo[‚‡ÚGÈýz3·!dÑ„@ dq€E9õ×3lfl%Ø™^Vv
@ÈB{)[²èïmÖ³l¬…8óI–½-?o{ÖΤ,÷IJhC ²ØKÙ²hmïÕΞâ}û‡.vÝÌznµ³ð±Lâc¹7†E ÜOpÁÅ^ÎÆEyüæ=£ÆÚÄÏnïýúº·7åå‡v³Í[;οŠþ•PˆÃp%*0B!ö
ÑÓè¼gÓX›8N—ï\èõXèÞÞ4·íTÏöõeùí$ñõ~À“Böº/kûϵýõ\Þ8½>SF+/åê1³{þÌœý†éêÔߊ*t-Áwí>ÕnW¿¯ö΀žE” 9åÕÈFY”ùöâ¼gÏX›*Ñ^¸ñÓ*‘uo›ËK;”Áð/.
½g/D‰ ?KQFþÝF3©ö|š9›1JÖi”¬÷m6‘lB/oD‘s0²èŒ=·fÎvBŒ‘u#ëŒ,JãK#YPdÑ1{ŽÍœ{+<˜WY÷v_ï®Úǽªêë{ñæѽЖ9ÅëÚ–9,À’–,X²(×z›÷ÌkÓÒö;+»>²ì6£®ËÛwÁýë½á0‚,JaRå!‹½œm¥Ê¢×vôúÁìÉï¼éŸ÷<kÁé*øLƒÐýËNÖ|SloŸmë¿ìÍ©ƒ·ú·Å*÷ï½Ðl(Y”PÆ+$YdQv1öü›9‹qT¬kQþk[W‡;+õ…›âš"z÷FÅ@r× ¤X³rA“Å^ÞV—,:â2¹è:Ö¦Úœ-fþô*t”×Õ·í»©ÁÛþ"„¢D3,K€A
±RˆòMYôÌkç1dÝ †"`È¢Ä0¾JŠ_, r÷DeBìù9vìÌTS±ÐýQnm‹x;©îªƒ³P:‹^ùJ”ÆeÈ[email protected]ÙïN-zfŽµ±Cˆ¬‘xV AdQ‚uÈEY”O±çã,Øf°ÃyE±ÝU}gÞøÛò]mŸ;ök‘{öWª¢Û„1®EÑë“Éé“ñ©ûRÃsõ£ŠÜcælÚópì1ÄY7!Gð}U‘nB•ÈÝŠJdqÀE™{΂½…˜!ë†0äC%†|Ÿ!~´àÈ)Y”ɱgà,Ø`˜¬‚…
Ëþ¨¶—;oì‰q°óFtì
‡]¹Û„1žM9€ Èb/åJ9cóÔ¢çÞX×4‹¹wY²«!ëþ¨+û4Š8¿z*"xƒaü¸ÛĦRŽ ²ØËÙ²({ø¢çÜX›0Ž‚³n…ì;V£.oǧkŠ Þ HN8Œ‘Ž,öR6Ž,Ê›J—=·ÆÚqí$:£xÛÞ$Ú‹R‡ÏîÂTðŸM Q"ÈWD…1
±Qˆr?8µìY6ÖÎɺ 9€7 ÅXd›@Æsªˆ ~Εs6Äže³dG!®FÖ
€Èˆ,JÃùTü\Á{÷R6†,ÊfØsl–ì'Ì#Ï;Y…ÎÚ5ñäo'›}]í.Gßú“+çà›¨"8¹W“ÅNñDcÙso¬ÍSkD”ußG”cyÃc³,‹Q˜e9‚@Êb/g«Pƒ´çæ,Ùj°"õß¾º?ê݇v+ÇoÍv,{¸coLŒ#‹†pä‚#‹½œ#‹ŽáØst–l5Ìã`²eÝÍÎοY—ûwöBŽ?ÃrßÐÙ&ŽbùÊ]–,X²(oëñ²gèX›gØàb¡û£i®Ì/ªw;ôwrˆGN7q„y•#†,²(w+DzçëX›).¼…‡|X÷ÇÞöÅÙ!Föjc|ûFDðFÄfUî6QŒ—¯@@d±—²Mª,:fRí;K6숿€#ë†päÞ G%ŽPA€d±—³dÑ W=sÇÚ\sÏfY…î¿ÛÅ÷íƒÇÆM\轿žBuš0†å(zeŠBìS¢c(öœ›¶ïØ·Ë…î¿Û×S‹ªjÿÏ]â}@‘“@‘Š,(²(Ïc]õ\kc†Y§²Þ
+C%€¼FQENÁË{£òΤØóuVì5ÄeÈ:M‘õÞhE%Šñ5QD¹{/g#È"$øäEy(ýùãMc;ÓêË×û“÷Íîð«_~°ëàáóÇê—vÍY³ûÓü3Û}þÃûomWi{˜[½»;ÙVïöŸþÔnxXrþçš¿ü`“Ä;ûä[sûм©ì½õ}ûØü¾ilGÜ—ÿa1¿ü»çÿð¤ÜÖ×»?l{Î×^ì¿jû}ò©ÙxÈù×ÿÿÿPK-!®ÄñQ"[Content_Types].xmlPK-!ùJ¬öW
sxl/styles.xmlPK-!é¦%¸‚Sü xl/theme/theme1.xmlPK-!òñ%>e¯docProps/core.xmlPK-! pUŠ¡5$docProps/app.xmlPK-!Š¥aú`qûxl/workbook.xmlPK-!'¡Œ=Å5߈xl/worksheets/sheet1.xmlPK
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1"><title>
</title>
<script type="text/javascript">
function changeLabel(){
document.getElementById("lblResult").innerHTML = "Please wait while your report is processed...";
}
</script>
</head>
<body>
<form method="post" action="Uploader.aspx" id="form1" enctype="multipart/form-data">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="+yve+0TnTzr8dZbqET3gRkZx/Pw9iGFmDqDyyfeTPMoXlPTPVgX3FrRUhTd3lBZE0DkzyUKzhXOi6MqTdxe1jnYL+mdzQiyoaM5w5cv9vij3X1xtsW8P1zACrDj6IqUK87n3GcwFtdHCCblAdgFI8nPQZsJnRv9w8lNIurcrbfad534ICOt8S/++vRi9+s91DFi3woIbFMyxw3rvbUPQwg==" />
</div>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="C153B6F1" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="c3fKPUwILazJv1aW60quCxYtkspAHgetjdwMb7ugaEBN7qnUTTL7SrAVizVMaqXPAPqmyhDV0rtT1upkWYH9eOzqHjjmjvr9ZHty08BHB9OD/fCIuF8ExZbOqpiXOdGA" />
</div>
<div>
<input type="file" name="fuReport" id="fuReport" style="width:306px;" />
<br />
<span id="lblResult">Report was successfully downloaded.</span>
<br />
<input type="submit" name="btnUpload" value="Upload" onclick="changeLabel();" id="btnUpload" />
</div>
</form>
</body>
</html>
然后我试着用HttpContext的更换所有的响应代码如下所示:
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", strReportName))
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
HttpContext.Current.Response.Write(strReportName)
HttpContext.Current.ApplicationInstance.CompleteRequest()
这也会下载一个.xls文件,但会显示网页的图形。再次,我无法发布图片,但Excel文件打开后会显示带有文字的按钮,上传&说:
报告已成功下载。
我研究了这个小时没有解决方案。我试图将这个特定的代码从try/catch /中拉出来,因为别人有成功,但这也没有帮助。
有没有人知道我可以如何正确地让浏览器下载带有我的NewReport的实际内容的.xls文件,而不是包含aspx页面的信息?
'ThreadAbortException'发生是因为'Response.End'。这是正常的行为。响应将从字面上结束,您不能继续执行页面,使您尝试更新标签文本毫无意义。可能更简单的解决方法是在单独的上下文中执行文件下载:提供指向文件的链接,以便在新页面或窗口中打开文件。你不需要'.aspx'页面,'.ashx'通用处理程序应该这样做。 – mason
感谢您的评论!是的,我发现Response.End在我研究这个问题的过程中引起了ThreadAbort,这就是为什么我尝试了其他选择。事情是,这将成为我们公司内部网的一个网页供内部使用,为了便于使用,我真的只想利用用户上传后下载的一个页面。如果可能,我想避免需要提供单独的链接。我试图找到一个工作的替代response.end。 –
有必要调用'Response.End'或一些等价物,因为这就是客户端 - 服务器通信的工作方式。如果你想使它更加无缝,你可以使用JavaScript来下载,就像在[这个问题]中一样(http://stackoverflow.com/questions/3749231/download-file-using-javascript-jquery)。或者由于您处于Intranet环境中,您可以将文件通过电子邮件发送给用户。 – mason