注册 登录
编程论坛 ASP技术论坛

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

徐昊 发布于 2018-05-09 13:27, 3325 次点击
先说一下功能需求:
只有本站会员才能查看附件,请 登录
,在公司网上点击这个黄色按钮,会从服务器下载一个.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
%>

现在问题是在采用低版本的IE浏览器,会弹出一个下载框,下载的是一个HTML文档,打开后里面内容是乱码。而使用其他高版本的IE浏览器可以正常下载,预览的类似于是一张图片的效果。我在网上找的解决方案(没有找到ASP相关的程序源码),针对于的方案,说需要使用Server.UrlEncode把文件名(文中的s_filename)转一下编码。我找到这个东西去ASP程序里面试了一下,报错,不清楚在ASP去如何实现这个转码操作。
我今天刚注册的论坛账号,也是刚开始接触ASP以及VB,所以有些东西还没能掌握。也是希望前辈们能给我一个方案,拜谢各位大佬。
1 回复
#2
徐昊2018-05-11 13:32
一位大佬都没路过的,真是有点忧伤。
关于这个问题,我依旧没能解决,但我自己的最终的猜想就是编码的问题。我去详细的看了一下整个程序的编码的格式。首先,frameset框架集里面就定义了网页的编码格式为950,big5。而我这个子网页则是在头部链接下的孙子(头部链接的子网页的子网页的一个小链接);其次在这个功能页面中,<!--#Include File="sys_Config.asp"-->这个个包含的这个页面也是定义的950,big5的编码格式。所以我觉得编码没能得到统一。虽然我使用了Response.Clear(),我对他也不是太了解。我以为它的作用能够清掉之前头部编码的定义,然后好像并没能达到效果。所以说这个网页的编码应该还是936(简体中文)或者950(繁体中文)或者big5(繁体中文)。而我打开的附件含有中文字符,IE8不能直接帮你转,在高版本的浏览器好像可以。所以解决方法是需要把文件名,额外的转成utf-8的编码格式。(很遗憾的是,我写不出来)
补充一下的就是,为什么我在头部定义了一个936,在高版本的IE浏览器上,虽然可以正常打开附件,但文件名是乱码,所以加上了936,文件名就好了。具体原因我也弄不清楚,本应该页面定义是繁体,而文件名也是繁体,在一个编码情况下,应该没啥问题,但它就是乱码了。
情况大致上是这样,这其中有的为我的想法,没经过严格测试,可能会存在有错误的地方,水平有限,希望别误导人就好!
1