特无语的一个中文乱码转换,转换出现一个字乱码,其他字转换成功...特无语

xqli_gd 2012-12-03 01:37:12
一下是dorado技术做的上传功能。


页面显示jsp代码:do-upload.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head>
<title>文件上传</title>
</head>
<body style="font-size:9pt;">

<d:View >

<%
request.setCharacterEncoding("UTF-8");
String filename = (String)request.getAttribute("filename");
String path = (String)request.getAttribute("path");
System.out.println("do-upload路径:"+path+" -- "+filename);
String uploaddate = (String)request.getAttribute("uploaddate");
if(filename != null && !filename.equals("") && path != null && !path.equals("")){
%>

<script>
parent.uploadSuccess("<%=filename%>","<%=path%>","<%=uploaddate%>");
SubWindow.hideParent();

</script>
<%
}
%>

<center>
<form method="post" enctype="multipart/form-data"
action="<%=request.getContextPath()%>/upload.upload.d">
<d:Layout type="vflow" width="90%">
<d:Pane valign="middle" height="60">
请选择要上传的文件:<!-- 主要是在这一步进行显示文件名称与路径 -->
<input class="TextEditor" type="file" name="file" style="width: 100%">
</d:Pane>
<d:Pane align="center"><!-- 点击上传,跳转到处理类 -->
<input class="Button" type="submit" value=" 上传 ">
</d:Pane>
</d:Layout>
</form>
</center>
</d:View>
</body>
</html>


处理类:UploadController.java
package view.upload;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import view.common.Viewconst;
import view.fileupdown.FilepathUtil;

import com.bstek.dorado.biz.FileController;
import com.bstek.dorado.utils.MetaData;

/**
* PictureController
*/
public class UploadController extends FileController {

/**
* 初始化窗口
* @param request
* HttpServletRequest
* @param fileUpload
* DiskFileUpload
*/
String systime = System.currentTimeMillis()+"";
protected void initFileUpload(HttpServletRequest request,
DiskFileUpload fileUpload) {
//System.out.println("进入方法:initFileUpload()");
fileUpload.setSizeMax(1024 * 10000); //
}

/**
* 设置保存图片文件路径。
* @param request
* HttpServletRequest
* @param parameters
* MetaData
* @return String
*/
protected File getUploadWorkDirectory(HttpServletRequest request,
MetaData parameters) {
String storedfilename = FilepathUtil.UPLOAD_INI_BASEPATH;
//System.out.println("---------------------------初始化路径:"+FilepathUtil.UPLOAD_INI_BASEPATH);
return new File(storedfilename+systime);
}

/**
* 上传保存到数据库
*
* @param request
* HttpServletRequest
* @param fileName
* String
* @param parameters
* MetaData
* @return String
*/
protected String getStoreFileName(HttpServletRequest request,
String fileName, MetaData parameters) {

//String name =request.getAttribute("file").toString();
System.out.println("----name:"+fileName);

int pos = fileName.lastIndexOf("\\");
//System.out.println("pos:"+pos);
String extName;
if (pos > 0) {
extName = fileName.substring(pos);
} else {
extName = fileName;
}
String fullFileName = extName;

String filePath = systime +"/"+ fullFileName;

/**
* 增加上,这部分,如果出现中文乱码情况,则出现路径跳转错误。
**/
try {
System.out.println("--------new String---getBytes---");

System.out.println("1:"+new String(fullFileName.getBytes("ISO-8859-1"),"gb2312"));
System.out.println("2:"+new String(fullFileName.getBytes("ISO-8859-1"),"UTF-8"));
System.out.println("3:"+new String(fullFileName.getBytes("ISO-8859-1"),"GBK"));
System.out.println("4:"+new String(fullFileName.getBytes("UTF-8"),"ISO-8859-1"));
System.out.println("5:"+new String(fullFileName.getBytes("UTF-8"),"GBK"));
System.out.println("6:"+new String(fullFileName.getBytes("UTF-8"),"gb2312"));
System.out.println("7:"+new String(fullFileName.getBytes("GBK"),"gb2312"));
System.out.println("8:"+new String(fullFileName.getBytes("GBK"),"UTF-8"));
System.out.println("9:"+new String(fullFileName.getBytes("GBK"),"ISO-8859-1"));
System.out.println("10:"+new String(fullFileName.getBytes("GB2312"),"gb2312"));
System.out.println("11:"+new String(fullFileName.getBytes("BIG5"),"gb2312"));

fullFileName = new String(fullFileName.getBytes("GBK"),"UTF-8");
filePath = new String(filePath.getBytes("GBK"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("-------fileName:"+fullFileName+" filePatg:"+filePath);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String uploaddate = sdf.format(new Date());
request.setAttribute("filename", fullFileName);
request.setAttribute("path", filePath);
request.setAttribute("uploaddate", uploaddate);

System.out.println("---------------------"+fullFileName);
return fullFileName;
}

/**
* 执行临时上传文件。
* @param request
* HttpServletRequest
* @param fileItem
* String
* @param storeFile
* String
* @param parameters
* MetaData
* @throws Exception
*/
@SuppressWarnings("unchecked")
protected void storeUploadFile(HttpServletRequest request,
FileItem fileItem, File storeFile, MetaData parameters)
throws Exception {
super.storeUploadFile(request, fileItem, storeFile, parameters);

Map fileMap = new HashMap();
fileMap.put("filename", request.getAttribute("filename"));
fileMap.put("path", storeFile);

}

/**
*
* @param request
* HttpServletRequest
* @return String
*/
protected String getDownLoadFileName(HttpServletRequest request) {
return null;
}

/**
*
* @param request
* HttpServletRequest
* @throws Exception
* @return InputStream
*/
protected InputStream getDownloadFileInputStream(HttpServletRequest request)
throws Exception {
return null;
}

}


报错提示:
-------fileName:本公司假期管??.doc filePatg:1354512819609/本公司假期管??.doc
---------------------本公司假期管??.doc
[dorado] 13:33:39,625 ERROR
java.lang.NullPointerException
at org.apache.commons.fileupload.DefaultFileItem.write(DefaultFileItem.java:442)
at com.bstek.dorado.biz.FileController.storeUploadFile(FileController.java:163)
at view.upload.UploadController.storeUploadFile(UploadController.java:138)
at com.bstek.dorado.biz.FileController.doUpload(FileController.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.bstek.dorado.action.Controller.doDispatch(Controller.java:220)
at com.bstek.dorado.action.Controller.internalDispatch(Controller.java:174)
at com.bstek.dorado.action.Controller.internalDispatch(Controller.java:138)
at com.bstek.dorado.action.Controller.invokeAction(Controller.java:113)
at com.bstek.dorado.action.ActionHandler.invokeAction(ActionHandler.java:140)
at com.bstek.dorado.action.ActionHandler.invokeAction(ActionHandler.java:130)
at com.bstek.dorado.core.DoradoServlet.doGet(DoradoServlet.java:83)
at com.bstek.dorado.core.DoradoServlet.doPost(DoradoServlet.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.bstek.dorado.core.FilterHandle.internalDoFilter(FilterHandle.java:328)
at com.bstek.dorado.core.FilterHandle.doFilter(FilterHandle.java:149)
at com.bstek.dorado.core.DoradoFilter.doFilter(DoradoFilter.java:69)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

...全文
963 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
子晓聊技术 2012-12-03
  • 打赏
  • 举报
回复
那篇帖子原因是对的,但解决方法有问题,弄错了。我给你说下你的解决方法,把字符全部统一为utf8编码,比如把*.dorado文件中的javaSourceEncoding属性值修改为UTF-8。那样就没什么问题了
子晓聊技术 2012-12-03
  • 打赏
  • 举报
回复
fullFileName = new String(fullFileName.getBytes("GBK"),"UTF-8"); 从你这段代码就可以看出,你是想GBK转换成utf8,你这样转换当汉字是奇数时候,最后一个肯定是乱码啊。GBK编码是一个中文2个字节,而UTF-8编码是一个中文3个字节,当我们调用getBytes("UTF-8")方法时,会通过计算来增加字节,使得从GBK的2个字节变成UTF-8对应的3个字节。 你可以看看这篇文章http://www.iteye.com/topic/1097560
网络科技 2012-12-03
  • 打赏
  • 举报
回复
本公司假期管??.doc 这个文件名,??可能是不可识别的字符,或中间有空格,你换个文件名上传试下

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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