Servlet:实现多个文件上传,上传中文文件乱码解决办法

标签: servlet 文件 上传 | 发表时间:2013-09-06 06:49 | 作者:ab6326795
出处:http://blog.csdn.net

首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar,可百度下下载,然后你编码完成后,上传时可能会遇到"servlet Bad version number in .class file"错误。

解决:

1.Window --> Preferences -->Java --> compiler中的compiler compliance level对应的下拉菜单中选择JDK版本.

2.Window --> Preferences -->MyEclipse --> Servers-->Tomcat --> Tomcat n.x -->JDK中的Tomcat JDKname下的下拉菜单中选择自己电脑上安装的JDK版本(必须与步骤1中的JDK版本一致).

如果还是没有解决,不用着急,因为有些MyEclipse版本自带有JDK版本,所以也要将它改过来.

3.Window --> Preferences -->Java -->Installed JRES,然后在右边选择与步骤1和2版本一致的JDK版本,如果没有,可以自己添加.然后选中就可以了.

4、.Window --> Preferences -->MyEclipse --> Servers-Resin 3-Resin 3.x-JDK-Resin jdk name:选择jdk1.6.0_03


接下来,我们来编码,实现多个文件上传

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	
  </head>
  
  <body style="margin:50px">
  <form action="servlet/UploadServlet" method="post" enctype="multipart/form-data">
     <p>上传文件:</p>
     文件1:<input type="file" name="file1" /><br/>
     描述:<input type="text" name="description1" /><br/>
     文件2:<input type="file" name="file2" /><br/>
    描述:<input type="text" name="description2" /><br/>
  <input type="submit" value=" 上  传 " />  
  </form>
  </body>
  </html>


com.xieyuan.ServletUpload.java

package com.xieyuan;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.sampled.AudioFormat.Encoding;

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;


public class UploadServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public UploadServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}


	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
         response.setCharacterEncoding("GB2312");
         response.getWriter().println("<script>alert('请用POST方式上传文件!')</script>");
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		File file=null;
		String description=null;
		
		String uploadPath=this.getServletContext().getRealPath("upload");
		String uploadTemp=this.getServletContext().getRealPath("upload/temp");
	    //设置响应格式(不设置请求格式,因为文件是二进制的,不能使用UTF-8格式化)
		response.setContentType("text/html;charset=gb2312");
		
		PrintWriter out=response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("<HEAD><TITLE>文件上传</TITLE></HEAD>");
		out.println("<BODY style='margin:50px'>");
		out.println("上传日志:<BR/>");
		//创建基于磁盘的工厂,针对大文件,临时文件将存储在磁盘
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//设置缓冲区大小,超出该文件直接写入到磁盘的大小设置门槛。
		factory.setSizeThreshold(10240);  //这里默认10KB
		//设置用于大于配置的大小阈值设置的临时存储文件目录。
		factory.setRepository(new File(uploadTemp));
		//创建一个文件上传的句柄
		ServletFileUpload upload=new ServletFileUpload(factory);
		//设置最大文件尺寸 ,这里是4MB
		upload.setSizeMax(4194304);
		upload.setHeaderEncoding("GB2312");
		
		try {
			//将解析结果放在LIST中
			List<FileItem> list =upload.parseRequest(request);
			out.println("遍历所有的 FileItem ... <br/>");
			// 遍历 list 中所有的 FileItem
			for(FileItem item:list)
			{
				// 如果是 文本域
				if(item.isFormField())
				{
					if(item.getFieldName().equals("description1")||item.getFieldName().equals("description2"))
					{
											
						description = item.getString("GB2312");	
						out.println("遍历到 "+item.getFieldName()+" ... <br/>"+description+"<BR/>");	
					}
				}
				else 
				{
					//否则为文件域,当getName为Null说明没有选则文件
					if((item.getFieldName().equals("file1")||item.getFieldName().equals("file2"))
							&&item.getName()!=null&&!item.getName().equals(""))
					{
						try 
						{
						
							File remoteFile=new File(item.getName());
							out.println("遍历到 file ... <br/>");
							out.println("客户端文件位置: " + remoteFile.getAbsolutePath() + "<br/>");
							// 服务器端文件,放在 upload 文件夹下
							file=new File(uploadPath,remoteFile.getName());
							if(!file.getParentFile().exists())
								file.getParentFile().mkdirs();
							if(!file.exists())
								file.createNewFile();
							
							item.write(file);
							
						} catch (Exception e) {
							
						}
						finally //总是立即删除保存表单字段内容的临时文件
						{
							item.delete();
						}
					}
				}
			}
			out.println("Request 解析完毕,文件上传完毕!");
		} catch (Exception e) {
			out.println("Request 解析异常!"+e.getMessage());
		}
		out.flush();
		out.close();
	}

	
	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
	}

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.xieyuan.UploadServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/servlet/UploadServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>

这样上传文件不会乱码。深入参看,剖析Commons-fileupload.jar上传原理,解决中文乱码原因,请看:

http://download.csdn.net/detail/ab6326795/6219065

张孝祥写的


作者:ab6326795 发表于2013-9-5 22:49:44 原文链接
阅读:79 评论:0 查看评论

相关 [servlet 文件 上传] 推荐:

Servlet:实现多个文件上传,上传中文文件乱码解决办法

- - CSDN博客Web前端推荐文章
首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar,可百度下下载,然后你编码完成后,上传时可能会遇到"servlet Bad version number in .class file"错误.

基于uploadify上传和 servlet 的下载

- - CSDN博客推荐文章
由于工作需要 暂时快速的选定了uploadify作为文件上传插件. 至于下载就匆忙的用servlet来实现. 首先到uploadify官网下载需要的Js文件. 然后需要自己手写一个Js 来调用 uploadify.js 重点只说上传 其他辅助功能方法不细说.                         'buttonText' : '添加附件',.

Servlet Filter 学习

- - CSDN博客架构设计推荐文章
最近在研究CAS , CAS 中的Servlet Filter 不太熟悉, 所以花了点时间学下了下这部分的知识, 分成以下几部分 学习. Servlet Filter  的功能和用法. Servlet Filter 顺序的注意事项. A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

Servlet、Filter和Listener

- - Web前端 - ITeye博客
Java Servlet是与平台无关的服务器端组件,运行于Servlet容器中(如Tomcat),Servlet容器负责Servlet和客户端的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式. Servlet可完成以下功能:. 1、创建并返回基于客户请求的动态HTML页面.

Servlet – 会话跟踪

- - ImportNew
HTTP本身是 “无状态”协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连接的内容.因此如果判断两次连接是否是同一用户, 就需要使用 会话跟踪技术来解决.常见的会话跟踪技术有如下几种:. URL重写: 在URL结尾附加. 会话ID标识,服务器通过会话ID识别不同用户..

servlet的四种响应

- - CSDN博客推荐文章
        在一个servlet的请求中,响应的方式的通常有四式,response.getWriter(),response.getOutputStream(),. request.getRequestDispatcher("ajax.jsp").forward(request, response) 和 response.sendRedirect("ajax.jsp").

Servlet是否线程安全

- - 研发管理 - ITeye博客
Servlet是线程安全吗. 要解决这个问题,首先要知道什么是线程安全:.   如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码. 如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题.

多文件上传

- - BlogJava-首页技术区
多文件上传 jquery的插件. 使用的方法  导入 jquery.js 及 jquery.MultiFile.js ,. 方式一: 后台是文件数组  .  private File[] upload; // 与jsp表单中的名称对应. 在 form 中加入 即可.

Servlet 3.0的檔案上傳寫法

- - 簡睿隨筆
Servlet 3.0已經大幅簡化網頁檔案上傳的程式寫法,以下是撰寫的幾個重點.
的enctype要是"multipart/form-data". 是主要使用的檔案瀏覽元素. 後端接收的Servlet寫在action屬性裡. 以@MultipartConfig(location = “c:/www/xxx/data/")指定寫檔路徑.

jsp+servlet实现验证码功能

- - CSDN博客推荐文章
验证码的功能大多数人可能不都理解,但几乎每个安全网站都会有. 验证码是用来防止非人为因素操作的行为,例如一个黑客要黑一个网站,怎么弄呢. 最简单的思路当然是造成其网路拥堵直至系统瘫痪掉. 如果没有验证码,那么我就可以在注册页面,写一个程序,只有注册表单,不断更换主键或不可重复的内容,不停的提交. 那这样每秒可以注册几万次都有可能,这样服务器就大量负载,很容易就瘫痪并死掉.