Servlet3.0支持文件的上传,而不必另外调用common-fileupload.jar等第三方组件。
Tomcat7.0开始支持Servlet3.0,Resin4.0也支持Servlet3.0。
但是最近使用Resin4+Servlet3.0实现文件上传操作时,发现一个问题-就是当调用直接写入文件的part.write("服务器文件写入绝对路径")这一句时,resin4.0总是会提示string越界-1的错误,但是同样的程序使用Tomcat7.0运行没有问题可以直接上传文件,而且在resin4.0下运行时从header中获取的中文文件名也是乱码。经过一番研究,终获解决(并参考了网上流行的一段乱码解决方案的代码,同时解决中文乱码的兼容性问题)。现录于此,仅供参考。
java端代码:
package com.test; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; //IOStream import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; //Servlet3.0 specific annotations import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.Part; @WebServlet(description = "FileUploadServlet Description", urlPatterns = { "/FileUploadServlet" }) @MultipartConfig public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public FileUploadServlet() { super(); System.out.println("FileUploadServlet Initialized & Instantiated."); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding")); //System.out.println("request编码方式:"+request.getCharacterEncoding()); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=utf-8"); //System.out.println("request编码方式:"+request.getCharacterEncoding()); //System.out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding")); PrintWriter out = response.getWriter(); out.println("<html><head><body>"); for (Part part : request.getParts()) { //String fileName = ""; String partHeader = part.getHeader("content-disposition"); //byte[]t=partHeader.getBytes(); //System.out.println("是否乱码:="+toUTF8(partHeader)); //if(partHeader.indexOf("?")>-1)//判断有乱码时自动重新尝试编码 partHeader=toUTF8(partHeader);//new String(partHeader.getBytes("ISO-8859-1"),"UTF-8");//resin4 long partSize = part.getSize(); out.println("<BR>Part Name = " + part.getName()); out.println("<BR>Part Header = " + partHeader); out.println("<BR>Part Size = " + partSize); System.out.println(">>>>>>>part.getHeader(\"content-disposition\") = "+ partHeader); } out.println("<center><h1>++++File Upload Completed Successfully</h1></center></body></html>"); // **** Custom Option ****// System.out.println("自定义上传文件名"); fileUploadWithDesiredFilePathAndName(request); System.out.println("使用自定义方式上传文件."); } /* * Following method allows us to place the uploaded file in a desired * Location on the server along with the desired fileName */ public void fileUploadWithDesiredFilePathAndName(HttpServletRequest request) throws IOException, ServletException { /******** Following part of code is not needed ********/ InputStream inputStream = null; FileOutputStream outputStream = null; try { for (Part part : request.getParts()) { System.out.println(part.getName()); inputStream = request.getPart(part.getName()).getInputStream(); int i = inputStream.available(); byte[] b = new byte[i]; inputStream.read(b); System.out.println("Length : " + b.length); // Finding the fileName // String fileName = ""; String partHeader = part.getHeader("content-disposition"); //if(partHeader.indexOf("?")>-1)//判断有乱码时自动重新尝试编码 partHeader=toUTF8(partHeader);//new String(partHeader.getBytes("ISO-8859-1"),"UTF-8");//resin4 System.out.println("Part Header = " + partHeader); System.out.println("====part.getHeader(\"content-disposition\") = "+ partHeader); for (String temp : partHeader.split( ";")) { if (temp.trim().startsWith("filename")) { fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", ""); } } String tempExtName=fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase().trim(); fileName=""+System.currentTimeMillis()+"."+tempExtName; //System.out.println(new String(fileName.getBytes(),"UTF-8")); //System.out.println(new String(fileName.getBytes(),"GBK")); //fileName=new String(fileName.getBytes("ISO-8859-1"),"UTF-8"); System.out.println(fileName); //System.out.println(new String(fileName.getBytes("ISO-8859-1"),"GBK")); // Writing contents to desired FilePath & FileName // String uploadDir = "c:/temp/"; System.out.println("File will be Uploaded at: " + uploadDir + "/" + fileName); outputStream = new FileOutputStream(uploadDir + "/" + fileName); outputStream.write(b); inputStream.close(); } } catch (Exception e) { System.out.println("Unable to Upload File: " + e); e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } if (outputStream != null) { try { outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } } private static String toUTF8(String str) { if (str == null) return null; String retStr = str; byte b[]; try { b = str.getBytes("ISO8859_1"); for (int i = 0; i < b.length; i++) { byte b1 = b[i]; if (b1 == 63) break; //1 else if (b1 > 0) continue;//2 else if (b1 < 0) { //不可能为0,0为字符串结束符 //小于0乱码 retStr = new String(b, "UTF-8"); break; } } } catch (UnsupportedEncodingException e) { // e.printStackTrace(); } return retStr; } }html页面代码:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>FileUpload</title> </head> <body> <center> <h1>FileUpload Demo Using Servlet3.0</h1> <form id="formId" action="FileUploadServlet" enctype="multipart/form-data" method="post"> <input type="file" id="FileUploadId" name="Upload" /> <!-- input type="file" id="FileUploadId2" name="Upload2" / --> <input type="submit" id="uploadButtonId" value="开始上传" /> </form> </center> </body> </html>