使用commons-fileupload包上传文件(含中文乱码解决方案)
简单实现form表单上传文件:
注意点一,将enctype的值设置为multipart/form-data
后端就简单使用servlet处理,这里只是为了简单展示一下如何用commons-fileupload包上传文件,代码如下:
package servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletFileUpload upload = new ServletFileUpload();
request.setCharacterEncoding("utf-8");
try {
File webRoot = new File("E:/code", "upload");
webRoot.mkdirs();
FileItemIterator itemIterator = upload.getItemIterator(request);
while(itemIterator.hasNext()) {
FileItemStream item = itemIterator.next();
String fileName = item.getName();
InputStream fieldStream = item.openStream();
File tempFile = new File(webRoot, new String(fileName.getBytes(),"GBK"));
System.out.println(tempFile.getAbsolutePath());
tempFile.getParentFile().mkdirs();
FileOutputStream outStream = new FileOutputStream(tempFile);
copy(fieldStream, outStream);
}
} catch (FileUploadException e) {
e.printStackTrace();
}
response.getWriter().write("post");
}
private void copy(InputStream fieldStream, FileOutputStream outStream) throws IOException {
byte[] buff = new byte[1024];
while(true) {
int n = fieldStream.read(buff);
if(n<0) break;
if(n==0) continue;
outStream.write(buff,0,n);
}
}
}
其实操作没啥特别的地方,都差不多固定的格式。
下面主要讲一下这个过程中出现的中文乱码的问题。
出现场景如下:
我想讲上传后的文件命名为它原来的名字,我最开始reques设置的编码格式是utf-8,然后我获取的原始的name的编码格式也设置为utf-8,结果所有的中文都显示为问号。
解决方案:
我继续将request的编码设置为utf-8,但是文件名的编码格式我设置为GBK,问题解决
猜测:
我觉得我原先读取的中文应该就是GBK编码,utf-8是兼容性最大的字符集编码且它本身就支持中文,所以utf-8转GBK编码就不会出现乱码