asp-classic - ASP Classic 正确处理使用 UTF-8 保存的文件

标签 asp-classic utf-8

在我的网络电子邮件服务器上,用户可以从电子邮件中下载附件。

当他们收到非英文的文件名时,文本在 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:

IE 8 file download prompt

那么问题就变成了 - 如何让 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 的重写器足够轻松地工作。我使用向导添加了一个用户友好规则:

Add user-friendly rule dialog

规则本身很简单:

IIS re-write rule settings

如您所见,我正在创建一个重写规则

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/

相关文章:

mysql - asp中查询结果的波动性

android - 使用许多不同种类的表情符号和语言(除了 ascii,但仍然有效的修改后的 utf-8)时,调用 C++ JNI NewStringUTF 会使 android 应用程序崩溃

vbscript - 如何使用 asp classic 返回 12 个月前的月份名称?

javascript - 在 ASP 中,将请求变量保存到框架 <frame src ="SomeOther.asp"的最佳方法是什么

asp.net - 如何处理 ASP.NET 站点中的 ASP 请求?

Python - unicode 字符串元组,编码错误

php - 使用 PHP 和 MySQL,如何正确地将智能引号写入数据库?

c# - XML - 帮助 RSS UTF-8 支持

python - 无法使用 python 将文本作为 UTF-8 写入文件

html - 需要在不使用代码的情况下更新多个网页中的日期代码 mm/dd/yyyy