2015-06-25 46 views
0

我有一个使用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Ÿûñä_õ¥1­K×Ê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页面的信息?

+0

'ThreadAbortException'发生是因为'Response.End'。这是正常的行为。响应将从字面上结束,您不能继续执行页面,使您尝试更新标签文本毫无意义。可能更简单的解决方法是在单独的上下文中执行文件下载:提供指向文件的链接,以便在新页面或窗口中打开文件。你不需要'.aspx'页面,'.ashx'通用处理程序应该这样做。 – mason

+0

感谢您的评论!是的,我发现Response.End在我研究这个问题的过程中引起了ThreadAbort,这就是为什么我尝试了其他选择。事情是,这将成为我们公司内部网的一个网页供内部使用,为了便于使用,我真的只想利用用户上传后下载的一个页面。如果可能,我想避免需要提供单独的链接。我试图找到一个工作的替代response.end。 –

+0

有必要调用'Response.End'或一些等价物,因为这就是客户端 - 服务器通信的工作方式。如果你想使它更加无缝,你可以使用JavaScript来下载,就像在[这个问题]中一样(http://stackoverflow.com/questions/3749231/download-file-using-javascript-jquery)。或者由于您处于Intranet环境中,您可以将文件通过电子邮件发送给用户。 – mason

回答

0

我放弃了做自动两种工艺的想法。我添加了一个Download按钮,只有在报告成功处理后才能看到。在下载按钮的点击事件中,我有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 
0

我喜欢使用的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()

+0

我感谢您的协助,但这不幸的是不适合我。文件下载后我的页面需要进一步处理,因此Response.End()不适用于此实例。 –