这次用jspSmartUpload做文件上传下载,该组件默认是GBK编码,当上传的文件名为中文时,我将文件名getBytes()下,将GBK改成UTF-8。测试了下,貌似没问题,突然有一次上传一文件时,发现最后几个字乱码,一直是??。在拿些文件测试,后来知道了是当文件名为中文奇数时,会乱码,而且还上传不了。再做测试,找原因,查看字符的长度,转成16进制看结果。觉得是jspSmartUpload组件对中文支持不足的问题。
在网上找解决方法。下了几个jar,都说解决中文乱码,彻底解决中文乱码!!!用到我这就都不管用,而且也看到很多回复说解决不了,乱码问题还是依旧!!!
这次自己找到jspSm的源代码,参考了网上的意见,自己稍微修改了下。发现能解决中文乱码问题,分享给和我遇到同样问题的朋友们!!!
1:当页面上传有参数时,中文会乱码,解决页面上中文参数乱码方法:
修改类SmartUpload()中的upload()方法
public void upload() throws ServletException,IOException,SmartUploadException
{ int i = 0; //boolean flag = false; boolean flag1 = false; //boolean flag2 = false; long l = 0L; //String s = "";//new String(); //String s2 = "";//new String(); String s4 = ""; //new String(); String s5 = ""; //new String(); String s6 = ""; //new String(); String s7 = ""; //new String(); String s8 = ""; //new String(); String s9 = ""; //new String(); String s10 = ""; //new String(); m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes]; int j; for(;i < m_totalBytes;i += j) { try { m_request.getInputStream(); j = m_request.getInputStream().read(m_binArray,i,m_totalBytes - i); } catch(Exception exception) { throw new SmartUploadException("Unable to upload."); } }for(;!flag1 && m_currentIndex < m_totalBytes;m_currentIndex++)
{ if(m_binArray[m_currentIndex] == 13) { flag1 = true; } else { m_boundary = m_boundary + (char)m_binArray[m_currentIndex];}
} if(m_currentIndex == 1) { return; } for(m_currentIndex++;m_currentIndex < m_totalBytes;m_currentIndex = m_currentIndex + 2) { String s1 = getDataHeader(); m_currentIndex = m_currentIndex + 2; boolean flag3 = s1.indexOf("filename") > 0; String s3 = getDataFieldValue(s1,"name"); if(flag3) { s6 = getDataFieldValue(s1,"filename"); s4 = getFileName(s6); s5 = getFileExt(s4); s7 = getContentType(s1); s8 = getContentDisp(s1); s9 = getTypeMIME(s7); s10 = getSubTypeMIME(s7); } getDataSection(); if(flag3 && s4.length() > 0) { if(m_deniedFilesList.contains(s5)) { throw new SecurityException("The extension of the file is denied to be uploaded (1015)."); } if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(s5)) { throw new SecurityException("The extension of the file is not allowed to be uploaded (1010)."); } if(m_maxFileSize > 0L && (long)((m_endData - m_startData) + 1) > m_maxFileSize) { throw new SecurityException("Size exceeded for this file : " + s4 + " (1105)."); } l += (m_endData - m_startData) + 1; if(m_totalMaxFileSize > 0L && l > m_totalMaxFileSize) { throw new SecurityException("Total File Size exceeded (1110)."); } } if(flag3) { SmartFile file = new SmartFile(); file.setParent(this); file.setFieldName(s3); file.setFileName(s4); file.setFileExt(s5); file.setFilePathName(s6); file.setIsMissing(s6.length() == 0); file.setContentType(s7); file.setContentDisp(s8); file.setTypeMIME(s9); file.setSubTypeMIME(s10); if(s7.indexOf("application/x-macbinary") > 0) { m_startData = m_startData + 128; } file.setSize((m_endData - m_startData) + 1); file.setStartData(m_startData); file.setEndData(m_endData); m_files.addFile(file); } else {/**
*原来的代码,当页面上要传入中文参数时,乱码。
*/ //String s11 = new String(m_binArray,m_startData,(m_endData - m_startData) + 1);
/**
*2008-10-28 carton修改,解决页面传入中文参数乱码
*/
String s11 = new String(m_binArray,m_startData,(m_endData - m_startData) + 1, "utf-8"); m_formRequest.putParameter(s3,s11);
} if((char)m_binArray[m_currentIndex + 1] == '-') { break; } } }
2:当上传时文件名为中文时,解决中文乱码
修改类SmartUpload()中的getDataHeader()方法
private String getDataHeader()
{ //boolean flag = false; int i = m_currentIndex; int j = 0; for(boolean flag1 = false;!flag1;) { if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13) { flag1 = true; j = m_currentIndex - 1; m_currentIndex = m_currentIndex + 2; } else { m_currentIndex++; } }/**
*原代码,当上传文件名为中文时,乱码
*/
//String s = new String(m_binArray,i,(j - i) + 1); //return s;
/**
*2008-10-28 carton修改,解决上传文件中文乱码问题
*/
Stirng s = null;
try {
s = new String(m_binArray,i,(j - i) + 1, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return s; }
这样页面上就不用再转码了。页面设置成"utf-8"编码即可。
附改好的jar包,和jspSmartUpload源代码.