Servlet实现文件上传

来源:互联网 发布:ubuntu 安装 uefi启动 编辑:程序博客网 时间:2024/05/22 14:27

需要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.printStackTrace();
}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>




0 0
原创粉丝点击