Servlet实现文件上传
2016-01-21 23:34
281 查看
需要commons-fileupload commons-io-1.4两个jar包
1 upload.jsp 上传表单设置 注意三个方面 1.enctype="multipart/form-data" 2.method="post" 3<input type="file" name="file"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传</title>
<script type="text/javascript">
function addOne(){
document.getElementById("add").innerHTML+='文件上传项:<input type="file" name="file"/><input type="button" value="加一个" onClick="addOne()"/><input type="button" value="减一个" onClick="delOne(this)"/><br/>';
}
function delOne(obj){
obj.parentNode.parentNode.removeChild(obj.parentNode);
}
</script>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/UploadServlet" method="post" enctype=multipart/form-data>
文件描述信息:<input type="text" name="description"/><br/>
文件上传项:<input type="file" name="file"/><input type="button" value="加一个" onClick="addOne()"/><input type="button" value="减一个" onClick="delOne(this)"/><br/>
<div id="add"></div>
<input type="submit" value="上传"/>
</form>
</body>
</html>
2 UploadServlet.java
package com.yilong.upload;
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 java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.yilong.util.IOUtil;
public class UploadServlet extends HttpServlet {
@SuppressWarnings( "unchecked")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//解决请求乱码只对post请求有效
response.setCharacterEncoding("utf-8");//解决响应乱码
try{
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setRepository(new File(getServletContext().getRealPath("/WEB-INF/temp")));//设置临时目录
factory.setSizeThreshold(1024*10);//设置缓冲区的大小
ServletFileUpload uploadFile=new ServletFileUpload(factory);
if(!uploadFile.isMultipartContent(request)){
throw new RuntimeException("上传表达不正确");
}
List<FileItem> lists=uploadFile.parseRequest(request);
for(FileItem fileItem:lists){
if(fileItem.isFormField()){//普通表单项
String name=fileItem.getFieldName();
String value=fileItem.getString("utf-8");
System.out.println(name+":"+value);
}else{
String fileName=fileItem.getName();
String uuidName=UUID.randomUUID().toString();
String finalName=uuidName+"_"+fileName;
String hashStr=Integer.toHexString(finalName.hashCode());
String path=getServletContext().getRealPath("WEB-INF/upload");
char[]hashCha=hashStr.toCharArray();
for(char c:hashCha){
path=path+File.separator+c;
}
if(!new File(path).exists()){
new File(path).mkdirs();
}
InputStream in=fileItem.getInputStream();
OutputStream out=new FileOutputStream(new File(path,uuidName));
IOUtil.In2Out(in, out);
IOUtil.close(in, out);
fileItem.delete();
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
}catch(FileSizeLimitExceededException e){
response.getWriter().write("上传文件过大");
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);//捕获运行异常进行处理
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
IOUtil.java
package com.yilong.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IOUtil {
private IOUtil(){}
public static void In2Out(InputStream in,OutputStream out) throws IOException{
byte[] bs=new byte[1024];
int i=0;
while((i=in.read(bs))!=-1){
out.write(bs, 0, i);
}
}
public static void close(InputStream in,OutputStream out){
try {
if(in!=null){
in.close();
}if(out!=null){
out.close();
}
} catch (IOException e) {
e.pri
4000
ntStackTrace();
}finally{
in=null;
out=null;
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.yilong.upload.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>
1 upload.jsp 上传表单设置 注意三个方面 1.enctype="multipart/form-data" 2.method="post" 3<input type="file" name="file"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传</title>
<script type="text/javascript">
function addOne(){
document.getElementById("add").innerHTML+='文件上传项:<input type="file" name="file"/><input type="button" value="加一个" onClick="addOne()"/><input type="button" value="减一个" onClick="delOne(this)"/><br/>';
}
function delOne(obj){
obj.parentNode.parentNode.removeChild(obj.parentNode);
}
</script>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/UploadServlet" method="post" enctype=multipart/form-data>
文件描述信息:<input type="text" name="description"/><br/>
文件上传项:<input type="file" name="file"/><input type="button" value="加一个" onClick="addOne()"/><input type="button" value="减一个" onClick="delOne(this)"/><br/>
<div id="add"></div>
<input type="submit" value="上传"/>
</form>
</body>
</html>
2 UploadServlet.java
package com.yilong.upload;
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 java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.yilong.util.IOUtil;
public class UploadServlet extends HttpServlet {
@SuppressWarnings( "unchecked")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//解决请求乱码只对post请求有效
response.setCharacterEncoding("utf-8");//解决响应乱码
try{
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setRepository(new File(getServletContext().getRealPath("/WEB-INF/temp")));//设置临时目录
factory.setSizeThreshold(1024*10);//设置缓冲区的大小
ServletFileUpload uploadFile=new ServletFileUpload(factory);
if(!uploadFile.isMultipartContent(request)){
throw new RuntimeException("上传表达不正确");
}
List<FileItem> lists=uploadFile.parseRequest(request);
for(FileItem fileItem:lists){
if(fileItem.isFormField()){//普通表单项
String name=fileItem.getFieldName();
String value=fileItem.getString("utf-8");
System.out.println(name+":"+value);
}else{
String fileName=fileItem.getName();
String uuidName=UUID.randomUUID().toString();
String finalName=uuidName+"_"+fileName;
String hashStr=Integer.toHexString(finalName.hashCode());
String path=getServletContext().getRealPath("WEB-INF/upload");
char[]hashCha=hashStr.toCharArray();
for(char c:hashCha){
path=path+File.separator+c;
}
if(!new File(path).exists()){
new File(path).mkdirs();
}
InputStream in=fileItem.getInputStream();
OutputStream out=new FileOutputStream(new File(path,uuidName));
IOUtil.In2Out(in, out);
IOUtil.close(in, out);
fileItem.delete();
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
}catch(FileSizeLimitExceededException e){
response.getWriter().write("上传文件过大");
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);//捕获运行异常进行处理
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
IOUtil.java
package com.yilong.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IOUtil {
private IOUtil(){}
public static void In2Out(InputStream in,OutputStream out) throws IOException{
byte[] bs=new byte[1024];
int i=0;
while((i=in.read(bs))!=-1){
out.write(bs, 0, i);
}
}
public static void close(InputStream in,OutputStream out){
try {
if(in!=null){
in.close();
}if(out!=null){
out.close();
}
} catch (IOException e) {
e.pri
4000
ntStackTrace();
}finally{
in=null;
out=null;
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.yilong.upload.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>
相关文章推荐
- [iOS] UICollectionView初始化滚动到中间的bug
- JS中Unexpected identifier错误
- 缺陷:域与静态方法
- OpenLayers3-9-Canvas Tiles
- android 支持的序列化-------Serializable和Parcelble
- Android设定字体大小,不随系统变化
- 配置nginx支持thinkphp框架
- Android Webview posturl 传参被encode问题
- 1、Winsock库
- Node爬坑记——伪造cookie
- chmod详解
- java的classpath和path理解
- 如何将Visual Studio的工程转成QT的工程
- HTML5 New Feature Series: WebSocket
- 0121 集合类 ArrayList 的练习
- 03-Log 日志常见配置
- MySQL数据库的优化 【转】
- CAAnimation 如何解决保持动画最后的状态不变
- Android属性动画欣赏——ValueAnimator与相关博文推荐
- 2016第3周四