表单 multipart/form-data 如何提交中文乱码

本文介绍了解决multipart/form-data提交中文时出现乱码的方法,包括修改SmartUpload源码和使用UploadBean替代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表单 multipart/form-data 如何提交中文乱码

解决方案:


multipart/form-data 是用来上传文件时的一个类型

如果用这个的话,有一个专门的乱码解决的啊**.getString(“文本框name”,”GB18030”);
那就不存在乱码了

貌似现在有中文版的,且无乱码,楼主搜索下。
另外,你的乱码也没有说清楚。
你可以修改jspsmartupload,让所有地方的编码都统一为UTF-8

关键字:smartupload,uploadbean,linux,中文乱码
一、SmartUpload上传文件乱码解决纪实
恶心指数:五星
完成程度:80%(文件名问题未解决)
问题描述:在windows下开发的web应用,用到了smartupload上传文件,需求很简单,就是一个表单文件formdata.jsp,一个获取表单并上传的文件getdata.jsp,调试的时候,windows和linux系统下均正常,当系统安装到另一台服务器的时候,却出现了获取表单参数值为乱码(全是问号???)的问题。
我脑子里面第一感觉是:两台机器,据同事说是同一张光盘安装的Linux,但我想,根据逻辑推断,肯定是这liux装得不一样,或者是相关的服务不一样。否则怎么可能呢?然而,上头任务交给我来解决了,而且系统马上要正式使用,如果我要求重新安装Linux,几乎是不可能的。那好,我不入地狱,谁入地狱?我就闯它一把。
其实在这个时候,我还认为问题不大的。因为java开发的东西,乱码问题是家常便饭,而解决办法也就是那几种。不就一个转码吗?当时头儿问我问题大不大,我说,应该没啥大问题。
我开始进行getByte()转码,用ISO-8859-1 与gb312/GBK”互相转换,未果,又加入UTF-8,不行;
又在<%@ page contentType=”text/html;charset=gb2312”>进行编码替换,不行;
修改linux LANG=zh_CN.GB2312,不行;
修改web.xml的charset,不行; 此时我几乎已经查遍了所有有关的网页,而且找到这问题和smartupload有关。但解决的人寥寥无几,而且解决的办法也很不详细,于是在csdn上发帖,结果半天没人理会,顶都没人顶。再上开发群上问,大家都忙,也无暇顾及。继续自己调试,用System.getProperty(“file.encoding”)得到的结果是ANSI_X3.4-1968,这是个什么码?上google查了一下,全是些无用信息,此时我心里不禁有些发冷NND,问题有些严重。。
当天到下班,我是没啥结果,已经头昏脑胀,不想加班了,但花大半天时间还没搞定这么一个“小问题”,实在是有些没面子,于是我向头儿保证,明天我一定解决。
回到屋里,茶不思饭不香。上QQ看看,跟一MM聊了几句,我说今天好累,她说我明天可以好好休息一下。啊?明天星期几?我一核实,靠,明天周六啊!看来老天注定要我周末加班了。
晚上没睡好,起来又是一顿查,还是没啥好办法。
第二天,11点才起床,起来煮碗面条就开始干,把那些编码用new String(str.getByte(“iso-8859-1“),“gbk“)这样的形式进行了若干中组合,不行,怎么办,看到有一个改smartupload源码的解决办法,我是很不想改源码的,因为服务器在远程,我没有root帐号,修改了类无法重启。
进展一:把formdata.jsp中<%@ page contentType=”text/html;charset=gb2312”>,取掉,加上,获取页面转码后能够正常显示中文。但是,大家都知道,这样做的后果是什么,formdta.jsp无法显示中文!这个问题更难做了,而且用response.setContentType居然对页面没有任何作用,真邪门了。
时间一点点过去,我终于动摇了,我开始试着去记忆root的密码,试了一下,我靠居然是对的。OK,终于可以大展拳脚了。
然而,smartupload的源码,居然很不好找,搜了半天没有。只好反编译了。用gel反编译出来的结果跟别人说的还不一样,就凑合着改了一下,
找到SmartUpload.java中的 public void upload(),加一个参数String charsetName,
找到这句 String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);
修改为String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,charsetName);
编译后上传,重启再试,发现有了一点进展。
进展二:部分参数能够正确读取了!
这只是表单文本框传值可以了,可文件名依然是乱码,我又折腾了半天,实在不想再去弄那个smartupload的源码了,虽然代码不多,但是我这么弄也太花时间了。(注:我觉得改源码应该可以解决问题,只是没有改完,文件名那部分需要进行处理。有兴趣的可以试试) 这时自然想到了换其他的上传包,搜了一下,有人说javazoom的不错,搞一个下来再说,demo很简单,
测试之后发现,只要在接收页面getdata.jsp中转码就可以了。转码方式,可以是一个个参数单独转,也可以用一句话就可以:request.setCharacterEncoding(“GBK”);同时要配合
MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,”GBK”);
这个uploadbean的做的非常体贴,居然提供一个ChineseUpload.jsp例子,其实主要就是上面两句话不同。
等我修改完,感觉差不多的时候,已经是深夜2点。想放松了,先睡再说。
周日,继续工作,发现一个新问题,uploadbean居然不能修改上传的文件名!这怎么行呢?是有一种变通方法,每个文件建立一个目录,然后放进去防止重名,但这有点恶心,而且直接进去的文件名还是乱码,这可咋整啊???
还好,我再次发现了UploadBean的优越性,我找到了一个帖子,说UploadBean1.5配合Filemover可以改名,于是又下了1.5和FileMover,FileMover中的例子也很详细简单。真是贴心
修改,上传重启,一切OK!
后来,又发现系统的几个相关BUG,一鼓作气,全部解决。 这个“小问题”,居然花了我整整两天的时间,可谓令我恼怒!同时,也想到跟我同样痛苦的兄弟们,我能减轻一下你们的痛苦,我这两天就没白干!我现在的口号是:“放弃SmartUpload,全面使用UploadBean”。我还写了一个Demo,以帮助痛苦的兄弟们快速解决问题。
下面,我把我写的Demo和需要的资料链接都贴在这里,大家有什么问题可以在这里跟我交流。 二、UploadBean上传解决方案
满意指数:五星
完成程度:100%

Demo:
1.表单页面sssformdata.jsp

<%@ page contentType="text/html;charset=gb2312" %> 
<head> 
<title>fbysss UploadBean 示例</title> 
<!--meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"--> 
<!--meta http-equiv="Content-Type" content="text/html; charset=gb2312"--> 
</head> 
<FORM name="form1" METHOD="POST" ACTION="sssupload.jsp" ENCTYPE="multipart/form-data"> 
<input name="title" type= "text" value="中文字"> 
<td class="bodystyle">附件</td> 
<td class="bodystyle"> <input name="attach" type="FILE" id="attach" size="50" > </td> 
<input name="ok" type= "submit" value="提交"> 
</form> 

2.读取表单页面sssgetdata.jsp


文件:UploadBean上传实例
功能:解决中文乱码,完成文件上传,并提供上传改名解决方案
作者:fbysss
msn:jameslastchina@hotmail.com


<%@ page contentType="text/html;charset=GBK" %> 
<%@ page language="java" import="com.jspsmart.upload.*"%> 
<%@ page import="java.text.SimpleDateFormat"%> 
<%@ page import="java.io.File"%> 
<%@ page import="java.util.*"%> 
<%@ page import="javazoom.upload.*"%> 
<%@ page import="uploadutilities.FileMover"%> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head> 
<% 
request.setCharacterEncoding("GBK");//设置编码格式,就不用一个个转码了。 
FileMover fileMover = new FileMover();//你也可以使用自带的实例中jsp:useBean的形式。 
UploadBean upBean = new UploadBean(); 
MultipartFormDataRequest mrequest = null; 
Hashtable files = null; if (MultipartFormDataRequest.isMultipartFormData(request)) 
{ mrequest = new MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");//注意这里也要设置编码参数 
String sTt0 = mrequest.getParameter("title"); 
out.println("<br>Title0是:"+sTt0+"<br>"); 
String sTt1 = new String(sTt0.getBytes("ISO-8859-1"),"GBK"); 
out.println("<br>Title1是:"+sTt1+"<br>"); 
//这里用来测试title参数是否正确。调试的时候,加一句if (true)return;即可。 
files = mrequest.getFiles(); 
} 
//获取修改前的文件名 
String sOldFileName =mrequest.getParameter("oldfilename"); 
out.println("sOldFileName:"+sOldFileName); 
String sWebRootPath = request.getRealPath("/");//得到你的web应用的根。 
String sPath=sWebRootPath+"attach"; 
int iFileCount = 0; 
String sServerFileName=""; 
String sLocalFileName = ""; 
//文件获取 
if ( (files != null) || (!files.isEmpty()) ) { iFileCount = files.size(); 
UploadFile file = (UploadFile) files.get("attach"); 
sLocalFileName=file.getFileName(); 
out.println("sLocalFileName:"+sLocalFileName); 
int ii= sLocalFileName.indexOf("."); //取文件名的后缀 
String sExt = sLocalFileName.substring(ii,sLocalFileName.length()); 
//得到不重复的文件名 
java.util.Date dt = new java.util.Date(System.currentTimeMillis()); 
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS"); 
sServerFileName= fmt.format(dt); 
sServerFileName =sServerFileName + sExt; 
//如果不存在该目录,则新建一个 
File dir =new File(sPath); 
if (!dir.exists()){ 
dir.mkdirs(); 
} 
upBean.setFolderstore(sPath);//设置要上传的目录 
upBean.addUploadListener(fileMover);//增加filMover监听 
fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名 
upBean.store(mrequest, "attach");//上传 
out.println("file path is "+sPath+"/"+sServerFileName); 
} %>

Demo注意事项:cos.jar,uploadbean.jar,filemover.jar这几个包必须有。
必备下载地址:
UploadBean1.5:http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip
FileMover1.3:http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip
参考下载地址:
ChinesUpload例子:http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip

new String(s.getBytes(“ISO-8859-1”),”utf-8”);

[原文地址] (http://www.debugease.com/javaweb/647851.html)

<think>好的,我现在需要帮用户解决在Unity中处理multipart/form-data的问题。首先,我得回忆一下multipart/form-data的基本概念。它通常用于HTTP表单上传文件,比如用户需要上传图片或者视频的时候。这种格式会将数据分成多个部分,每个部分对应一个表单字段,包括文件内容和其他文本数据。 接下来,我得想想Unity中常用的网络请求方法。Unity本身可以使用UnityWebRequest类来处理HTTP请求,但可能对于复杂的multipart/form-data支持不够直接。用户可能需要手动构建请求体,或者使用第三方库来简化流程。这时候,我需要检查Unity的文档,看看UnityWebRequest是否有直接的方法支持multipart表单提交。 查阅文档后发现,UnityWebRequest确实提供了UnityWebRequest.Post方法,但当需要上传文件时,可能需要使用UnityWebRequest.AddFormField和UnityWebRequest.AddBinaryData来添加表单字段和文件数据。不过,构建multipart/form-data可能需要更细致的处理,比如手动拼接各个部分的边界符(boundary)和内容。这时候,可能需要编写自定义的代码来生成正确的请求体。 另外,用户可能需要处理多个文件或者混合文本和文件数据的情况。这时候,正确设置每个部分的Content-Disposition和其他头信息就很重要。例如,文件部分需要指定filename和Content-Type,而文本字段则不需要这些。同时,边界符必须在整个请求体中唯一,并且正确分隔各个部分。 还可能遇到编码问题,比如二进制文件的正确传输,或者文本字段的编码格式。需要确保所有数据都被正确编码,并且请求头的Content-Type设置为multipart/form-data,并附带正确的boundary参数。 另外,参考用户提供的引用内容,他们提到了Go语言中的相关库,但用户的问题是关于Unity的,所以可能需要寻找Unity社区中的解决方案或者第三方插件。例如,是否有类似RestSharp的库可以在Unity中使用,或者是否需要自己实现multipart的构建逻辑。 最后,测试和调试也是关键步骤。用户可能需要使用工具如Postman来模拟请求,对比Unity中的实现,查看请求头和请求体的差异,从而找到问题所在。例如,检查boundary是否正确生成,各部分是否被正确分隔,文件内容是否正确编码等。 总结一下,处理步骤可能包括:创建UnityWebRequest对象,构建multipart/form-data的请求体,设置正确的请求头,发送请求并处理响应。需要注意边界符的生成、各部分格式的正确性,以及编码问题。如果有现成的库或工具可以简化这个过程,会更有帮助,否则需要手动实现。</think>在Unity中处理`multipart/form-data`主要用于文件上传或混合表单数据的场景。以下是分步实现方法: --- ### **1. 手动构建请求体** 使用`UnityWebRequest`时,需手动拼接符合RFC 2046标准的格式: ```csharp string boundary = "UnityBoundary" + DateTime.Now.Ticks.ToString("x"); byte[] boundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); UnityWebRequest request = new UnityWebRequest(url, "POST"); request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary); // 构建数据流 using (var stream = new MemoryStream()) { // 添加文本字段 string textData = "Content-Disposition: form-data; name=\"username\"\r\n\r\nuser123"; stream.Write(Encoding.UTF8.GetBytes(textData), 0, textData.Length); // 添加文件字段 byte[] fileBytes = File.ReadAllBytes(filePath); string header = $"Content-Disposition: form-data; name=\"file\"; filename=\"{fileName}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; stream.Write(boundaryBytes, 0, boundaryBytes.Length); stream.Write(Encoding.UTF8.GetBytes(header), 0, header.Length); stream.Write(fileBytes, 0, fileBytes.Length); // 结束标记 byte[] endBoundary = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--"); stream.Write(endBoundary, 0, endBoundary.Length); request.uploadHandler = new UploadHandlerRaw(stream.ToArray()); } ``` --- ### **2. 使用第三方库简化** 推荐使用社区库如**RestSharp for Unity**或**UnityHTTP**: ```csharp var form = new MultipartFormData("UnityBoundary" + DateTime.Now.Ticks); form.AddField("text_field", "value"); form.AddFile("file_field", fileBytes, "image.png", "image/png"); var request = new Request(url, Method.POST); request.SetForm(form); request.Send((response) => { Debug.Log(response.Text); }); ``` --- ### **3. 关键注意点** - **边界符**:必须唯一且以`--`开头和结束 - **编码规范**:二进制文件需用`application/octet-stream`类型,文本字段需UTF-8编码 - **性能优化**:大文件上传建议分块传输[^1] --- ### **常见问题排查** 1. **服务端接收失败**:检查请求头`Content-Type`是否包含正确的`boundary` 2. **中文乱码**:显式设置字符集: ```csharp request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary + "; charset=utf-8"); ``` 3. **文件损坏**:确保二进制数据未经过Base64转换(除非服务端要求) ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值