通过Request.BinaryRead读取form上传的文件,文件名是乱码

itakeblue 2017-11-07 09:11:52
请教各位,我创建一个 2012船票.txt 文件,文本内容也为 2012船票

通过
<form id="form" action="upload.asp" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="submit" value="upload" />
</form>


然后通过

Dim biData, PostData
Size = Request.TotalBytes
biData = Request.BinaryRead(Size)
PostData = BinaryToString(biData,Size)
Response.Write "<pre>" & PostData & "</pre>" '使用pre,原样输出格式

Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = createObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS.Open
RS.AddNew
RS("mBinary").AppendChunk(biData)
RS.update
BinaryToString = RS("mBinary").Value
RS.Close
End Function

读取上传来的原始值,得到:

-----------------------------7e1f3261510f6
Content-Disposition: form-data; name="file"; filename="C:\Users\User\Desktop\2012鑸圭エ.txt"
Content-Type: text/plain

2012船票
-----------------------------7e1f3261510f6--


可以看到内容的中文是对的,而文件名的中文部分变成了乱码,请问这是为什么呢?
...全文
803 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
itakeblue 2017-11-09
  • 打赏
  • 举报
回复
实际环境中,上传的文件不单单是txt,还可能是其它jpg等二进制文件。 你说得对的,的确是需要将二进制的数据保存为文件。 微软有一篇教程: https://support.microsoft.com/en-us/help/299692/how-to-upload-files-to-a-web-server-by-using-asp 除了没有考虑到webkit内核的浏览器生成的boundary,如 ie生成的boundary:---------------------------7e11521f1510f6 chrome生成的boundary:----WebKitFormBoundaryZ7qZwFBnY17SraNN 工作还算正常,就是文件名是乱码。所以我发贴来请教。 我的需求是html form上传文件到vb6生成的dll,这样可以保存超过500m的大文件。无组件的试了几个都会出错。 然后希望文件名不要乱码,有没有简单的函数可以将文件名乱码 2012鑸圭エ.txt 恢复成正常的 2012船票.txt ??? 我也尝试将无组件的代码移植到vb中,但是当
Set oSourceData = CreateObject("ADODB.Stream")
oSourceData.Write request.BinaryRead(nPartBytes)
出现了overflow错误。
Go 旅城通票 2017-11-09
  • 打赏
  • 举报
回复
引用 4 楼 itakeblue 的回复:
引用
代码文件名不会乱码,文件是utf-8存储的,也不会乱码。
这是用 Response.BinaryWrite 输出的,请问怎样将 bidata 转换为字符串,而又保持不变成乱码呢?
这个你还得检测txt文件的编码,确定编码后用adodb.stream读取二进制才行。你干嘛将----------------------7e1f3261510f6这种东东存数据库。要存也是直接存二进制数据 asp无惧上传类库
itakeblue 2017-11-09
  • 打赏
  • 举报
回复
@cnbjx ,感谢你的回答帮我指明了思路。 我上传的页面使用了utf-8编码,当我用utf-8编码打开upload.txt的确文件名不是乱码了。 关于你说的获取boundary来处理上传数据,我近期也学习到了,然后使用了下面的function将二进制数据转换成utf-8编码的字符串,文件名正常显示了。
Const adTypeBinary = 1
Const adTypeText = 2
Const adModeReadWrite = 3

Function BytesToString(bytes, charset)
    With CreateObject("ADODB.Stream")
        .Mode = adModeReadWrite
        .Type = adTypeBinary
        .Open
        .Write bytes
        .Position = 0
        .Type = adTypeText
        .Charset = charset
        BytesToString = .ReadText
    End With
End Function

response.write BytesToString(biData,"utf-8")
因为开发的项目考虑商用,所以就不太能用第三方的商业组件。H5的客户端还没有去了解,前面看了UploadiFive也是要收费的。 感谢!
cnbjx 2017-11-09
  • 打赏
  • 举报
回复
很早以前写过上传的代码,略有研究,简单回答一下楼主的问题 关于编码,是浏览器根据当前上传页面编码自动适配的,文件的编码你暂时不用管。先给你一个简单的代码,把上传的内容保存到文本文件。


Dim Bytes

Bytes = Request.BinaryRead(Request.TotalBytes)

Call SaveBytes("upload.txt",Bytes)

Function SaveBytes(file,ByRef Content)
	With Server.CreateObject("Adodb.Stream")
		.Type = 1
		.Open
		.Write Content
		.SaveToFile Server.MapPath(file) , 2
		.Close
	End With
End Function 
为什么暂时不用管上传file的编码,因为上传的文件有可能是UTF-8编码,有可能是gbk或其它编码。文件上传组件都是将上传的内容 二进制保存,不存在编码问题。 现在有了 这个 upload.txt 文件,你可以试着用不同的编码打开。看看filename不乱码时 是不是你页面的编码! 好了,现在大概知道原理了。现在我简述一下如何获取文件名。 1. 从header 中获取分断的 boundary ,然后根据 boundary 和 2个换行回车符 用 instrb函数 从 Bytes 获取到 Content-Disposition: form-data; name="file"; filename="C:\Users\User\Desktop\2012鑸圭エ.txt" Content-Type: text/plain 2. 上面获取到的是二进制形式,再转成当前编码的字符串就可以了。 上传代码稍有点复杂,几句话肯定说不清。关于大文件上传,给楼主几个建议吧。 1. 用成熟的组件算了,如aspupload。当然有研究精神,可以继续深入。 2. 现在H5客户端都很厉害,大文件可以支持分断、分块上传。如500M的文件,可以分成50个上传,服务端再合并就好了。
itakeblue 2017-11-08
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
干嘛不用别人写好的类库直接提取文件内容保存到硬盘? 编码都统一了吗?你用gb还是utf-8 Web开发学习资料推荐 asp json类库解析json字符串
谢谢版主回复。 编码统一好了,在页面标题前都加入了

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Session.CodePage = 65001
Response.Charset = "UTF-8"
%>
还是没有用。之所以想知道原因一是这个错误很直接,重现很容易,想知道原因。另外主要是将上传功能做到vb6生成dll来保存上传文件,现在主体都实现了,就是中文文件名会乱码,所以来请教各位。 搜索后,这个问题在以下文章也被提及过,不过只贴出了整段解决问题后的代码,不知道具体是哪个环节的问题。。 upload_5xsoft.inc中文乱码的解决方法
Go 旅城通票 2017-11-08
  • 打赏
  • 举报
回复
干嘛不用别人写好的类库直接提取文件内容保存到硬盘? 编码都统一了吗?你用gb还是utf-8

Web开发学习资料推荐
asp json类库解析json字符串
itakeblue 2017-11-08
  • 打赏
  • 举报
回复
引用
代码文件名不会乱码,文件是utf-8存储的,也不会乱码。
这是用 Response.BinaryWrite 输出的,请问怎样将 bidata 转换为字符串,而又保持不变成乱码呢?
Go 旅城通票 2017-11-08
  • 打赏
  • 举报
回复
- -
引用 2 楼 itakeblue 的回复:
[quote=引用 1 楼 showbo 的回复:] 干嘛不用别人写好的类库直接提取文件内容保存到硬盘? 编码都统一了吗?你用gb还是utf-8 Web开发学习资料推荐 asp json类库解析json字符串
谢谢版主回复。 编码统一好了,在页面标题前都加入了

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Session.CodePage = 65001
Response.Charset = "UTF-8"
%>
还是没有用。之所以想知道原因一是这个错误很直接,重现很容易,想知道原因。另外主要是将上传功能做到vb6生成dll来保存上传文件,现在主体都实现了,就是中文文件名会乱码,所以来请教各位。 搜索后,这个问题在以下文章也被提及过,不过只贴出了整段解决问题后的代码,不知道具体是哪个环节的问题。。 upload_5xsoft.inc中文乱码的解决方法[/quote] utf-8你的所有asp文件存储编码也需要存储为utf-8编码才行 并且你是直接输出txt 二进制,txt如果是ansi编码,非utf-8内容是会乱码的,文件名不会乱码,内容编码和meta指定的编码不一致。 2进制保存到文件和内容直接输出也还和文件存储编码有关,所以最好是文件名归文件名,内容另外保存到硬盘,而不是全部保存 下面代码文件名不会乱码,文件是utf-8存储的,也不会乱码。如果是其他存储编码如ansi,内容会乱码
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Session.CodePage = 65001
Response.Charset = "UTF-8"
if request.QueryString("op")="upload" then
  Size = Request.TotalBytes
  biData = Request.BinaryRead(Size)
  Response.BinaryWrite bidata
  response.End
end if
%>
<form id="form" action="?op=upload" method="post" enctype="multipart/form-data">
    <input name="file" type="file" />
    <input type="submit" value="upload" />
</form>

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧