首页 新闻 会员 周边

关于ASP使用IE8下载文件,文件内容乱码问题

0
悬赏园豆:200 [已解决问题] 解决于 2018-05-17 17:17

先说一下实现的需求,在公司的工作网页上。点击这个黄色按钮,就自动从服务器下载相对应各种单的.tif文件。

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--#include file="conn.asp"-->
<!--#Include File="chk_Login.asp"-->
<!--#Include File="sys_Config.asp"-->

<%
dim  s_fpcnnum ,s_flag,s_fpath,sql,place,s_realpath,s_filename
s_fpcnnum= Trim(Request.QueryString("n"))
s_flag= Trim(Request.QueryString("f"))
s_fpath ="D:/joblogdata/Fpcn/" 
'Response.Write  s_fpcnnum   '变量n获取的是发票编号
'Response.Write s_flag  '变量f获取的是选择打开的附件编号 1-6
'Response.Write s_fpat '文件存储绝对路径
sql = "select s_DeliveryFile,s_ExportItemFile,s_ExportReplyItemFile,s_SignItemFile, s_SignItemReplyFile,s_PackBoxItemFile,s_Addtime from t_Fpcnf where s_DeliveryNum='"&s_fpcnnum&"'"
'查询各个发票信息
'Response.Write sql
set place=conn.execute(sql)
'place 执行的查询结果
'Response.Write place("s_ExportItemFile")    '如查询出仓单
If place.eof or place.bof Then
Response.Write("查询不到附件内容,请联系管理员确认附件是否上传成功,即是否存在该附件!")
Else
    'if place("s_ExportItemFile") <> "" then
    'Response.Write place("s_ExportItemFile")
    'end if
    '如果出仓单存在,就打印出来
    Select Case s_Flag
         Case "1" s_filename=place("s_ExportItemFile")          '出仓申请单
         Case "2" s_filename=place("s_ExportReplyItemFile")    '出仓单回执
         Case "3" s_filename=place("s_DeliveryFile")         '送货单
         Case "4" s_filename=place("s_PackBoxItemFile")        '装箱单
         Case "5" s_filename=place("s_SignItemFile")            '货物签收单
         Case "6" s_filename=place("s_SignItemReplyFile")    '货物签收单回执
End Select
    s_realpath = s_fpath&Year(place("s_Addtime"))&"/"&GetTimePath(place("s_Addtime"),0)&"/"&s_fpcnnum&"/"&s_filename
    'Response.Write s_realpath
     Dim strchar,fliesend,objectFile,objfile,objStream
     Const loadfilesize=32768 '32KB,也可取其它值,单位:字节
    fliesend=0 
      TransferFile = True 
    Set objectFile = Server.CreateObject("Scripting.FileSystemObject") 
      Set objfile = objectFile.GetFile(s_realpath) 
      Set objStream = objfile.OpenAsTextStream(1,-1)
    
    Response.Clear()
      Response.AddHeader "ContentType","application/octet-stream"
    Response.AddHeader "Content-Disposition","attachment;filename="&s_filename 
      Response.AddHeader "content-length",objfile.Size 
       Do While Not objStream.AtEndOfStream 
     strchar = objStream.Read(1) 
     Response.BinaryWrite(strchar) 
     fliesend = fliesend + 1 
     If (fliesend MOD loadfilesize) = 0 Then 
       Response.Flush 
       If Not Response.IsClientConnected Then 
         TransferFile = False 
         Exit Do 
       End If 
     End If 
   Loop
  Response.Flush 
  If Not Response.IsClientConnected Then
    TransferFile = False
  end if
  objStream.Close 
  Set objStream = Nothing 
  Set objectFile = Nothing 
  Response.End
end if
%>
View Code

上面我写的代码中,遇到的问题是:在使用IE8点击的时候,它会弹出一个下载框,下载的类型是html文档,打开的内容都是乱码。而使用高版本的IE则直接自动下载,预览的类似于图片的效果。在网上寻求解决方案。没有找到ASP的,找到个ASP.NET。针对他上面提出的解决方案,使用server.urllencode把文件名转码成utf-8。我在ASP程序找到这个东西,试了下程序立马报错。我刚开始接触ASP和VB,所以还没能掌握太多。所以想请知道的大佬教一下,在这里恳请各位大佬支一下招,拜谢各位!

ASP
汉中欸的主页 汉中欸 | 初学一级 | 园豆:8
提问于:2018-05-09 14:21
< >
分享
最佳答案
0

这东西一看,ASP,古老的传说,估计熟悉的人不多了。

第一种方法:自己查查资料应该能查到。

第二种方法:换个浏览器啊, 企业内部一个行政命令就能解决的事情。

收获园豆:100
爱编程的大叔 | 高人七级 |园豆:30839 | 2018-05-09 14:36

@此前啃码,方得此后: 下个低版本的浏览器不升级呗,或者就你说的QQ浏览器,不要升级不就好了, 能代码贴合环境自然最好了,但是不支持就是不支持啊,你们领导不升级项目所用技术,也不想升级系统或者换浏览器,这不是耍流氓吗,都说XP有BUG,嘿,我就是要用,就是不升级,我就要你做到即使有BUG也不影响我使用? 说句实话,用没有人维护的系统, 以及过时的技术,对你一点成长也没有..... 解决了这个问题又怎么样呢,等你以后出去的时候,这些经验卵用没有,大家都不用这些了

顾星河 | 园豆:7173 (大侠五级) | 2018-05-09 15:09
其他回答(4)
0

ie8直接不支持  微软都放弃ie了

收获园豆:30
ycyzharry | 园豆:25653 (高人七级) | 2018-05-09 14:51

因为公司的实际环境大都是XP,win7的也都是IE8。整体换数量大,且xp貌似升级不了高版本的IE。
所以问题就丢过来了,一句简单的把代码改一下!唉,都是爷

支持(0) 反对(0) 汉中欸 | 园豆:8 (初学一级) | 2018-05-09 14:56
0

设置Response.ContentType为application/octet-stream

收获园豆:50
西漠以西 | 园豆:1675 (小虾三级) | 2018-05-10 10:52

Response.AddHeader "ContentType","application/octet-stream"
我在代码里面设置了的

支持(0) 反对(0) 汉中欸 | 园豆:8 (初学一级) | 2018-05-10 10:59
0

request.set....   设置编码格式,后面具体参数忘记了。

response.set....

收获园豆:20
good_idea | 园豆:74 (初学一级) | 2018-05-17 16:29
0

功能实现下载就行,也不死磕到底了。说一下我最终的解决方案:

先贴一下代码:

 1 <%@LANGUAGE="VBSCRIPT" CODEPAGE="950"%>
 2 <!--#include file="conn.asp"-->
 3 <!--#Include File="chk_Login.asp"-->
 4 <!--#Include File="sys_Config.asp"-->
 5 <%
 6 Response.Clear()
 7 dim  s_fpcnnum ,s_flag,sql,place,s_realpath,s_filename
 8 s_fpcnnum= Trim(Request.QueryString("n"))
 9 s_flag= Trim(Request.QueryString("f"))
10 's_fpath ="http://59.41.253.170:81/joblogdata/Fpcn/" 
11 's_fpath ="D:/joblogdata/Fpcn/" 
12 'Response.Write  s_fpcnnum       '变量n获取的是发票编号
13 'Response.Write s_flag              '变量f获取的是选择打开的附件编号 1-6
14 'Response.Write s_fpath                 '文件存储绝对路径
15 sql = "select s_DeliveryFile,s_ExportItemFile,s_ExportReplyItemFile,s_SignItemFile, s_SignItemReplyFile,s_PackBoxItemFile,s_Addtime from t_Fpcnf where s_DeliveryNum='"&s_fpcnnum&"'"
16 '查询各个发票信息
17 set place=conn.execute(sql)
18 'place 执行的查询结果
19 'Response.Write place("s_ExportItemFile")    '如查询出仓单
20 Select Case s_Flag
21          Case "1" s_filename=place("s_ExportItemFile")          '出仓申请单
22          Case "2" s_filename=place("s_ExportReplyItemFile")    '出仓单回执
23          Case "3" s_filename=place("s_DeliveryFile")         '送货单
24          Case "4" s_filename=place("s_PackBoxItemFile")        '装箱单
25          Case "5" s_filename=place("s_SignItemFile")            '货物签收单
26          Case "6" s_filename=place("s_SignItemReplyFile")    '货物签收单回执
27 End Select
28 s_realpath = s_fpath&Year(place("s_Addtime"))&"/"&GetTimePath(place("s_Addtime"),0)&"/"&s_fpcnnum&"/"&s_filename
29 Response.Write s_realpath
30 %>
View Code

最后为每个按钮设置点击事件返回结果

1 function openFpFile(n,f){
2     //window.open("./OpenFile.asp?n="+n+"&f="+f);
3      $.get("./OpenFileNew.asp?n="+n+"&f="+f,function(res){
4         if(res!=''){                                             
5          window.location.href = res;
6         }
7     });
8 }
View Code

经测试,IE8可以下载该附件了。

说明一下其中的一些变化,最开始纠结的是编码问题,听网上说页面统一转成utf-8格式就不会乱码了,所以最开始设置的编码是65001,但会出现文件名乱码,再将这个页面设置成936(简体中文)之后便不会乱码了,所以也就没在意它了。后来想了想,我真是画蛇添足。既然这个页面调用了一些其他的页面(都是950,繁体),我都设置成繁体不就行了,不是和想统一编码格式一样的效果吗,统一了之后文件名果真不会乱码了。

接下来就是IE8的问题了,代码里也没有继续写如何下载了,最终返回一个文件地址就行了。通过Get方式直接把这个路径赋给它。想的是windows.open();一下,测试发现那个窗体老是一闪而过,经过大佬提醒,他说是窗口问题。我自己理解的是窗口开了2个,覆盖了原本有东西的页面。后来换成了href就能正确读到附件了。

解决的很糙,主要都是公司的一位大佬的教导,不然我还在死磕怎么解决兼容性的问题。最后,也感谢各位的回复,或多或少都给了一些建议和意见。你们随手之举,很有可能帮助过很多碰到问题的小白们,解决了我们的燃眉之急,真挚的谢谢你们!

汉中欸 | 园豆:8 (初学一级) | 2018-05-17 17:14

可以的,听说ASP和jsp很相似?只接触过jsp,没接触过asp。反正我在jsp里面直接<%java代码 request.set....解决编码问题的。

支持(0) 反对(0) good_idea | 园豆:74 (初学一级) | 2018-05-17 17:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册