在我的网络电子邮件服务器上,用户可以从电子邮件中下载附件。
当他们收到非英文的文件名时,文本在 IE 8/9 中会被破坏,但在 Chrome/Firefox 中却完全正常。这是当前处理下载的代码:
<%
attachfile = request("file")%>
<%
files = Split(attachfile,"\")
Set fso = CreateObject("Scripting.FileSystemObject")
Response.Clear
'Response.CharSet="UTF-8"
Response.ContentType = "application/unknown"
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "Expires", "0"
Response.AddHeader "Content-Transfer-Encoding", "binary"
Response.AddHeader "Content-Disposition","attachment; filename = " & files(Ubound(files))
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1
objStream.LoadFromFile attachfile
Response.BinaryWrite objStream.Read
Response.Flush
objStream.Close : Set objStream = nothing
Set fso = Nothing
%>
</BODY>
</HTML>
然后我将内容配置中文件名的传递方式更改为以下内容,希望在保存到客户端计算机上之前能够正确地以 UTF-8 形式对字符串进行编码:
Response.AddHeader "Content-Disposition","attachment; filename = " & Server.URLEncode(files(Ubound(files)))
现在我已经解决了一个问题,但我面临两个新问题 -_-
第一个问题是,当我在 IE 8/9 中下载文件时,文件名不再被破坏,但它在文件扩展名末尾添加了一个奇怪的 [1] 或 [2]。因此,如果我有 파일 1.docx,IE 会将文档保存为 파일 1.docx[1]
第二个问题是,在 Chrome 中,浏览器按字面意思获取 UTF-8 编码的字符串,因此它会保存为 파일%20%1.docx。请注意,文件的非英语部分已正确显示,但空白区域显示为 Unicode 字符代码 20。
我该如何解决这个问题?
最佳答案
解决方案
与浏览器最兼容的方法似乎是将所需的文件名放入 URL,而不是 Content-Disposition
响应 header 中。
例如:
http://localhost/[webpage]/파일.docx
当用户单击上面的链接时,它将保存正确的文件名。以下内容来自 IE 8:
那么问题就变成了 - 如何让 ASP 识别具有上述格式的 url?答案是你使用 url 重写器。
- 对于 IIS 7 及更高版本,有官方 re-write module from Microsoft 。
- 对于 IIS 6,您可以使用 Ionics Isapi Rewrite Filter 的最新版本 (2.x) 。微软recommends这适用于较旧的 IIS 版本。
- 对于 IIS 5,您还可以使用 Ionics Isapi Rewrite Filter ,但是您可能必须使用 (1.x) 版本。要下载旧版本,请参阅链接右侧的“其他下载”部分。文档在说明哪个版本的过滤器支持哪个 IIS 版本方面似乎不一致。
如果您使用的是 IIS 4 或更早版本,我强烈建议您升级。
我没有太多使用 URL 重写器的经验,但我能够让 Microsoft 的重写器足够轻松地工作。我使用向导添加了一个用户友好
规则:
规则本身很简单:
如您所见,我正在创建一个重写规则
http://localhost/default2/foo.doc/
http://localhost/default2/foo.doc (also works)
至
http://localhost/default2.asp?f=foo.doc
当调用网页(default2.asp)时,它可以从url参数f
中抓取文件名。
与您的问题无关,但您可能还需要进行一些身份验证,以确保只有适当的用户才能访问文件链接,从而访问您的文件。
来源
How to encode the filename parameter of Content-Disposition header in HTTP?
How to encode UTF8 filename for HTTP headers? (Python, Django)
关于asp-classic - ASP Classic 正确处理使用 UTF-8 保存的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14433360/