Java EE文件上传

原创 2015年09月17日 09:36:21

本文介绍Java EE中的三种文件上传方式

Java EE6 以上使用的方式(建议使用)

Java EE6以上可以不依赖任何第三方jar包完成文件上传
首先,编写一个简单的html,用于上传文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% String base =request.getContextPath()+"/"; //项目路径 %>
<html>
<head>
    <title></title>
</head>
<body>
  <form action="<%=base%>uploadFileServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment" />
    <input type="submit" value="提交" />
  </form>
</body>
</html>

然后是uploadFileServlet的内容,注意使用了注解,因此不需要再web.xml中配置了
package chapter3;


import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;

/** 通过表单上传文件
 * Created by chenhong on 15/9/15.
 */
@WebServlet(
        name="uploadFileServlet",
        urlPatterns = {"/uploadFileServlet"}
)
@MultipartConfig(
        fileSizeThreshold = 5_242_880 , // 5MB,小于5MB的上传文件将保存在内存中
        maxFileSize = 20_971_520L , //20MB, 禁止上传大小超过20MB的文件
        maxRequestSize = 41_943_040L //禁止大小超过40MB的请求
)

public class UploadFileServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part filePart =req.getPart("attachment"); //获取表单文件
        resp.setCharacterEncoding("UTF-8"); //设置返回数据的编码
        if(filePart!=null)
        {
            boolean success = processAttachment(filePart); //处理文件
            if(success)
            {
                resp.getWriter().append("文件上传成功");
            }
            else
            {
                resp.getWriter().append("文件上传失败");
            }
        }
        else
        {
            System.out.println("没有上传文件");
            resp.sendRedirect("upload.jsp");
        }
    }

    /**
     * 处理上传文件
     * @param filePart 上传文件
     * @return 文件是否上传成功
     */
    private boolean processAttachment(Part filePart) throws IOException
    {
        String type = getType(filePart.getContentType());//获取文件类型
        InputStream inputStream = filePart.getInputStream();
        File file = new File(getServletContext().getRealPath("/")+System.currentTimeMillis()+"."+type); //以 系统毫秒数 为新文件名
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
        int read ;
        final byte[] bytes = new byte[1024];

        while(  (read = inputStream.read(bytes))!=-1 )
        {
            bufferedOutputStream.write(bytes,0,read);
        }
        bufferedOutputStream.flush(); //一定要记得flush,否则可能会导致文件损坏
        return true;
    }

    /**
     * 获取文件类型
     * 如输入   image/png 则输出 png
     * @param contentType 输入类型
     * @return
     */
    private String getType(String contentType)
    {
        return  contentType.substring(contentType.indexOf("/")+1);
    }
}




SmartUpload方式

使用SmartUpload需要SmartUpload.jar包,可以使用下面的链接下载

链接1:https://code.google.com/p/assisted-learning/downloads/detail?name=smartupload.jar&can=2&q=

链接2:http://download.csdn.net/detail/ch717828/8836663 

下面通过一个上传文件的Demo来演示如何使用SmartUpload上传文件和普通表单

首先是一个待提交的表单:

 <form action="servlet/SmartUploadFile" method="post" enctype="multipart/form-data">
    	上传文件1:<input type="file" name="myfile1" /><br>
  		上传文件2:<input type="file" name="myfile2" /><br>
  		上传文件3:<input type="file" name="myfile3" /><br>
  		普通表单域:<input type="text" id="username" name="username" /><br>
  		<input type="submit" value="提交" />
    </form>

SmartUploadFile这个servlet使用了SmartUpload来处理上传
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;




public class SmartUploadFile extends HttpServlet {

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

	/**
	 * 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 {
		
		/*获取文件存储路径*/
		String filePath = getServletContext().getRealPath("/") + "images";
		File file = new File(filePath);
		if(!file.exists()){
			file.mkdir();
		}
		
		/*上传文件*/
		SmartUpload smartUpload = new SmartUpload();
		smartUpload.initialize(getServletConfig(), request, response);
		smartUpload.setMaxFileSize(1024*1024*10);
		smartUpload.setTotalMaxFileSize(1024*1024*100);
		smartUpload.setAllowedFilesList("txt,jpg,gif,png");
		int fileCount =0;//上传文件的数量
		try {
			smartUpload.setDeniedFilesList("rar,jsp,js");
			smartUpload.upload();
			for(int i=0;i<smartUpload.getFiles().getCount();i++)
			{
				com.jspsmart.upload.File f= smartUpload.getFiles().getFile(i);
				String ext =  f.getFileExt();   // 文件名后缀
				if (f.isMissing()) continue;  //如果没有上传文件,就跳过
				f.saveAs(filePath+File.separator+System.currentTimeMillis()+"."+ext); //以新文件名存储	
				System.out.println("上传文件"+System.currentTimeMillis()+i+"."+ext);
				fileCount++;
			}		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SmartUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		/*获取普通表单域*/
		String username = smartUpload.getRequest().getParameter("username");
		System.out.println("用户名:"+username);

		request.setAttribute("responseStr",fileCount);
		request.getRequestDispatcher("/index.jsp").forward(request, response);
		
		
	}

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

}
完整Demo:      http://download.csdn.net/detail/ch717828/8836695

Commons FileUpload方式

前端使用html, 后台用servlet , 完成普通表单和文件上传的功能

前端jsp内容如下

<form action="servlet/formservlet" method="post" enctype="multipart/form-data" >
    	<input type="text" id="username" name="username" /><br/>
    	<input type="file" id="file" name="file" /><br/>
    	<input type="submit" value="提交" />
    </form>

servlet 处理如下

首先是一个转换编码的函数

public String getStr(String str)
	{
		String s=null ;
		if(str!=null)
		{
			try {
				s = new String(str.getBytes("ISO8859-1"),"gb2312");
			} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("转码出现错误");
			}
		}
		return s;
	}

接下是doPost中的处理

request.setCharacterEncoding("gb2312");
		response.setContentType("text/html;charset=gb2312");
		//设置合法的后缀名
		final String[] allowedatt = new String[] {"doc","docx","html","htm"};
		//创建该对象 
	    DiskFileItemFactory factory = new DiskFileItemFactory();
	    //上传文件所用到的缓冲区大小,超过此缓冲区的部分将被写入到磁盘
	    factory.setSizeThreshold(4*1024);
	    //使用fileItemFactory为参数实例化一个ServletFileUpload对象   
	    ServletFileUpload upload = new ServletFileUpload(factory);
	     //要求上传的form-data数据不超过1000M
	    upload.setSizeMax(100*1024*1024);
	    //java.util.List实例来接收上传的表单数据和文件数据
	    List itemList;
		try {
			itemList = upload.parseRequest(request);
			//迭代list中的内容
		    Iterator it = itemList.iterator();
		    //循环list中的内容
		    while(it.hasNext())
		    {
		    	 //取出一个表单域
		    	 FileItem item =(FileItem) it.next();
		    	 //如果表单域是普通表单
		    	 if(item.isFormField())
		    	 {
		    		 //取出表单域的name,对应input的name
		    		String name = (String)item.getFieldName();
		    		//如果name的值是username
		    		if("username".equals(name))
		    		{
		    			//输出username表单中的值
		    			System.out.println(getStr(item.getString().trim()));
		    		}
		    		
		    	 }
		    	 //如果不是普通表单,则代表是文件上传的表单
		    	 else
		    	 {
		    		 //获取上传文件的名字
		    		 String totalNameatt = getStr(item.getName());
		    		 //获取文件的后缀名
		    		 String suffixatt =  totalNameatt.substring(totalNameatt.lastIndexOf(".") + 1);
		    		 //判断后缀名是否是我们允许上传的类型
		    		 boolean isValide=false;
		    		 for(int i=0;i<allowedatt.length;i++) {
			        		if(suffixatt.equals(allowedatt[i])){
			        			isValide=true;
			        		}
			        	}
		    		 //如果是不允许的类型,输出错误信息
		    		 if(!isValide)
		    		 {
		    			 System.out.println(totalNameatt+"该文件类型不在允许上传的范围内");
		    			 return ;
		    		 }
		    		 //如果是合法的,就保存该文件,文件名不变
		    		 else
		    		 {
		    			 //获取项目根目录
		    			 String rootPath = this.getServletConfig().getServletContext().getRealPath("/");  
		    			//要存储的文件的绝对路径
		    			 String file = rootPath +System.currentTimeMillis()+"."+suffixatt;
		    			 item.write(new File(file));
		    			 System.out.println("文件上传成功:"+file);
		    			 
		    		 }
		    		 
		    	 }
		    	
		    }
		    
		    
		    
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

完整的项目可以看 

http://download.csdn.net/detail/ch717828/8371595

参考:http://blog.csdn.net/hzc543806053/article/details/7524491




版权声明:本文为博主原创文章,未经博主允许不得转载。

Java EE 文件上传(下载)的实现

最近学习中,用Servlet实现了文件的上传、下载 二者的大致步骤都差不多 获取源文件的文件位置,文件名 获取源文件的输入流并建立缓冲区把输入流存放到缓冲区中 指定要输出的目标文件,建立输出流 把缓...
  • qq_35362572
  • qq_35362572
  • 2017年03月27日 12:14
  • 783

<JAVA EE>文件上传

实现文件上传功能
  • huahai_nb
  • huahai_nb
  • 2017年02月16日 16:18
  • 115

如果把JAVA EE项目打成war包,上传到服务器!

首先先用Myeclipse 8.6(我用的版本)将JAVA EE项目打成war包,      点击项目名,右键-->Export-->选Java EE文件夹下的WAR file(MyEclipse)...
  • u013456370
  • u013456370
  • 2016年03月15日 18:19
  • 1837

java ee简单文件上传

在Web中我们经常需要上传文件,以下是一个比较简单文件上传方式 其中JSP端代码如下: ...
  • u010228448
  • u010228448
  • 2016年09月01日 10:20
  • 785

关于JAVA EE项目在WEB-INF目录下的jsp页面如何访问WebRoot中的CSS和JS文件

转自:http://www.cnblogs.com/coolhwm/archive/2011/11/27/2265272.html 在有Struts部署的Java EE环境中,我们一般把js...
  • xyy511
  • xyy511
  • 2016年04月21日 15:33
  • 754

重新学javaweb---文件上传监听--进度条

update方法API void update(long pBytesRead, long pContentLength, int pItems)Parameters:pBytesRead - Th...
  • fangchao3652
  • fangchao3652
  • 2016年05月10日 00:27
  • 1998

Java EE 快速入门

分享一些边学边做项目的Java EE经历
  • webzhuce
  • webzhuce
  • 2016年11月05日 23:06
  • 2080

JAVA EE 环境搭建

以下将详细介绍在Eclipse下搭建Java EE开发环境的每一步, 环境:Win 7 + JDK 1.7 + Eclipse IDE for Java EE Developers 3.7 +T...
  • long458
  • long458
  • 2014年12月07日 21:44
  • 4359

Java EE中Ajax技术简单实现

1.异步数据获取技术,使用XMLHttpRequest.   2.基于标准的表示技术,使用XHTML与CSS.   3.动态显示和交互技术,使用Document Object Model(文档对象模型...
  • suwu150
  • suwu150
  • 2016年05月18日 12:42
  • 851

Java EE 学习内容和顺序

最近在学JavaEE,没学Java SE时那么有感觉。。一个月下来,感觉收获甚少。安慰自己那是一个厚积薄发的过程。现在有些迷茫,有点像是无头苍蝇,到处乱撞,看到关于Java EE 的书就想拿起来看...
  • zdlkh
  • zdlkh
  • 2017年02月22日 14:51
  • 530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java EE文件上传
举报原因:
原因补充:

(最多只允许输入30个字)