I have a simple ASP.NET webpage using VB with a file upload control. The user will upload a .xls and a new .xls file is created in the project directory with a new format and some calculations. This file saves, opens, and displays without an issue.
我有一个简单的ASP.NET网页使用VB和文件上传控件。用户将上载.xls,并在项目目录中使用新格式和一些计算创建新的.xls文件。此文件保存,打开和显示没有问题。
Within this button click event, I want the newly-created file to download to the user's browser/Downloads folder. When using Response.WriteFile with a Response.End, the .xls file downloads properly...BUT there's a thread abort exception that is caught and nothing after the Response.WriteFile line is processed even if I put it in the catch statement (i.e. I have a label that I want to tell the user to then display that the file has been successfully downloaded).
在此按钮单击事件中,我希望新创建的文件下载到用户的浏览器/下载文件夹。当Response.WriteFile与Response.End一起使用时,.xls文件正确下载...但是,即使我将它放在catch语句中,也会在处理Response.WriteFile行之后捕获线程中止异常并且没有任何内容(即我有一个标签,我想告诉用户然后显示该文件已成功下载)。
Here's the initial code that mostly works:
这是最常用的代码:
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
I've seen some different recommendations for the ContentType of .xls files. Both of the content types above will download the file but nothing in the Catch or Finally statement is processed. lblResult still reads, "Please wait while your report is processing..."
我已经看到了.xls文件的ContentType的一些不同的建议。上面的两种内容类型都将下载该文件,但不会处理Catch或Finally语句中的任何内容。 lblResult仍然写道:“请等待你的报告处理......”
I found online that the issue lies with Response.End(). Per https://support.microsoft.com/en-us/kb/312629/en-us, I replaced this with
我在网上发现问题在于Response.End()。根据https://support.microsoft.com/en-us/kb/312629/en-us,我将其替换为
HttpContext.Current.ApplicationInstance.CompleteRequest()
This caused a new issue. My .xls file would download, but it seemed to display gibberish, followed by some of the aspx page content. Here, the label is correctly listed even though it has not changed on the webpage. I don't have enough reputation to include a screenshot, but this is some of what the Excel file displays:
这引起了一个新问题。我的.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È?Wdq@EÙï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>
I then tried replace all of the Response code with HTTPContext as shown here:
然后我尝试用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()
This also downloads a .xls file but with a graphical representation of the webpage. Again, I cannot post a picture, but the Excel file opens to show the button with text, Upload & says:
这也会下载.xls文件,但会显示网页的图形表示。再次,我无法发布图片,但Excel文件打开以显示带有文本的按钮,上传并说:
Report was successfully downloaded.
报告已成功下载。
I have researched this for HOURS with no solution. I have tried pulling this particular code out of the try/catch/finally as someone else had success with but this did not help either.
我已经研究了这个没有解决方案的HOURS。我尝试将这个特定的代码从try / catch / finally中拉出来,因为其他人已经取得了成功,但这也无济于事。
Does anybody know how I can properly have the browser download the .xls file with the actual contents of my NewReport instead of it containing information from the aspx page??
有没有人知道我如何正确地让浏览器下载.xls文件与我的NewReport的实际内容而不是它包含来自aspx页面的信息?
2 个解决方案
#1
0
I like to use BinaryWrite, something like this:
我喜欢使用BinaryWrite,如下所示:
Dim ms As New IO.MemoryStream
xWB.Write(ms)
Dim bytes As Byte() = ms.ToArray
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("content-disposition", "attachment;filename=" & strReportName)
Response.BinaryWrite(bytes)
Response.Flush()
Response.End()
#2
0
I gave up on the idea of doing both processes automatically. I added in a Download button that only becomes visible once the report has been successfully processed. On the Download button's on click event, I have the excel file download. It's one more click than I wanted, but it gets the job done.
我放弃了自动完成这两个过程的想法。我添加了一个下载按钮,只有在成功处理报告后才会显示。在点击事件的下载按钮上,我有excel文件下载。它比我想要的还要多一点,但它完成了工作。
Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click
If fuReport.HasFile Then
Try
'All report processing occurs & report is created without issue
lblResult.Text = "Report was successfully processed."
btnDownload.Visible = True
Catch
lblResult.Text = "An error occurred. Please try again."
Finally
fuReport = New FileUpload()
End Try
Else
lblResult.Text = "Please select a report to upload."
End If
End Sub
Protected Sub btnDownload_Click(sender As Object, e As EventArgs) Handles btnDownload.Click
Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", strReportName))
Response.ContentType = "application/vnd.ms-excel"
Response.WriteFile(strReportName)
Response.End()
End Sub
End Class
#1
0
I like to use BinaryWrite, something like this:
我喜欢使用BinaryWrite,如下所示:
Dim ms As New IO.MemoryStream
xWB.Write(ms)
Dim bytes As Byte() = ms.ToArray
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("content-disposition", "attachment;filename=" & strReportName)
Response.BinaryWrite(bytes)
Response.Flush()
Response.End()
#2
0
I gave up on the idea of doing both processes automatically. I added in a Download button that only becomes visible once the report has been successfully processed. On the Download button's on click event, I have the excel file download. It's one more click than I wanted, but it gets the job done.
我放弃了自动完成这两个过程的想法。我添加了一个下载按钮,只有在成功处理报告后才会显示。在点击事件的下载按钮上,我有excel文件下载。它比我想要的还要多一点,但它完成了工作。
Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click
If fuReport.HasFile Then
Try
'All report processing occurs & report is created without issue
lblResult.Text = "Report was successfully processed."
btnDownload.Visible = True
Catch
lblResult.Text = "An error occurred. Please try again."
Finally
fuReport = New FileUpload()
End Try
Else
lblResult.Text = "Please select a report to upload."
End If
End Sub
Protected Sub btnDownload_Click(sender As Object, e As EventArgs) Handles btnDownload.Click
Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", strReportName))
Response.ContentType = "application/vnd.ms-excel"
Response.WriteFile(strReportName)
Response.End()
End Sub
End Class