Servlet、commons-fileupload等方法上传图片到项目制定目录的方法总结


        图片上传,文件上传是web开发必备的技能,大有用处,不可小觑,设计到相关I/O流,以及对Servlet容器等知识原理的掌握,目前常用的方式大概有以下几种:

  1. Servlet3.0对文件上传的支持
  2. commons-fileupload.jar
  3. smartupload.jar
  4. struts2实现文件上传

       下面贴上实现的几种方式,陆续完善,所有方式公用一个文件上传表单文件upload.jsp


     Servlet3.0实现文件上传

当需要普通表单域数据时可以通过req.getParameter("XXX")来获得,到时只能接收英文和数字,中文字符并不能解析,字符编码转码并不能用!

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



  
    
    
    My JSP 'upload.jsp' starting page
    
	
  
  
	
  
  
	
  
      
	
  
  
	
  
  
	
  
  

  
  
  
    	
  
  
select:

package com.bookstore.action;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebInitParam;
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 org.apache.catalina.Context;
import org.apache.catalina.core.ApplicationPart;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.bookstore.entity.Book;
import com.bookstore.entity.Category;


@WebServlet("/UpLoadServlet")
@MultipartConfig()
public class UpLoadServlet extends HttpServlet{

	private static final long serialVersionUID = 2687272335062029603L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
			doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		// 对请求包设置编码
		req.setCharacterEncoding("utf-8");
		// 告知tomcat如何编码,浏览器如何解码
		resp.setContentType("text/html; charset=utf-8");
		
		//获得项目的根目录
		String savePath=getServletContext().getRealPath("/image");
		
		// 为了简单,后面也直接就以fileName作为保存文件的名称
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyMMddHHmmss");
		String fileName=dateFormat.format(new Date())+".jpg";
		
		Part part = req.getPart("file");
		System.out.println(part.getContentType());
		System.out.println(part.getSize());
	
		Collection
   
   
    
     headerNames = part.getHeaderNames();
		// 遍历文件上传域的Header Name
		for (String headerName : headerNames) {
			System.out.println(headerName + "---->" + part.getHeader(headerName));
			
		}
		// 将文件保存到项目下的uploads文件夹下,为了简单这里没写判断目录是否存在及创建目录的操作,要先确保该目录已经存在
		part.write(savePath + "/" + fileName);
	}

}

   
   

     commons-fileupload实现文件上传

@WebServlet(urlPatterns="/UploadServlet",
		initParams={@WebInitParam(name="filePath",value="/image"),@WebInitParam(name="tempPath",value="/temp")}) 
public class UploadServlet extends HttpServlet{

	private static final long serialVersionUID = 2687272335062029603L;
	private String filePath; //文件保存路径
	private String tempPath; //文件临时目录
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		
		
		//config 不但可以读取web.xml文件的初始值,也可以读取注解中的初始化参数,并复制给filePath、tempPath成员属性
		filePath=config.getInitParameter("filePath");
		tempPath=config.getInitParameter("filePath");
		//servlet上下文,servlet运行环境,对象,容器,application
		//获得绝对路径
		ServletContext context = getServletContext();
		filePath = context.getRealPath(filePath);
		tempPath = context.getRealPath(tempPath);
		
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
				
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		// 对请求包设置编码
		req.setCharacterEncoding("utf-8");
		// 告知tomcat如何编码,浏览器如何解码
		resp.setContentType("text/html; charset=utf-8");

        //文件保存路径
        File saveDir = new File(filePath);  
        // 如果目录不存在,就创建目录  
        if(!saveDir.exists()){  
            saveDir.mkdir();  
        }  
		
        // 创建文件上传核心类  
        DiskFileItemFactory factory = new DiskFileItemFactory(); 
        // thrshold: 极限,临界值,表示磁盘缓存 1k
 		factory.setSizeThreshold(1*1024);
 		// repository: 储存室,即临时文件目录
 		factory.setRepository(new File(tempPath));
 		
        ServletFileUpload sfu = new ServletFileUpload(factory);  
        //设置编码  
        sfu.setHeaderEncoding("UTF-8");  
        // 设置上传的单个文件的最大字节数为2M  
        sfu.setFileSizeMax(1024*1024*2);  
        //设置整个表单的最大字节数为10M  
        sfu.setSizeMax(1024*1024*10);  
        
        
        try{  
            // 处理表单请求  
            List
    
    
     
      itemList = sfu.parseRequest(req);  
            for (FileItem fileItem : itemList) {  
                // 对应表单中的控件的name  
                String fieldName = fileItem.getFieldName();  
                System.out.println("name名称:" + fieldName);  
                
                // 如果是普通表单控件  
               if(fileItem.isFormField()){  
	            	    String value = fileItem.getString(); 
	                    //重新编码,解决乱码  
	                    value = new String(value.getBytes("ISO-8859-1"),"UTF-8");  
	                    System.out.println("普通内容:" + fieldName + "=" + value);  
                
                // 上传文件  
                }else{  
                    // 获得文件大小  
                    Long size = fileItem.getSize();  
                    // 获得文件名  
                    String fileName = fileItem.getName();  
                    System.out.println("文件名:"+fileName+"\t大小:" + size + "byte");  
                    
                    //设置不允许上传的文件格式  
                    if(fileName.endsWith(".exe")){  
                       System.out.println("不支持的文件上传类型");
                    }else{  
                        //将文件保存到指定的路径  
                        File file = new File(filePath,fileName);  
                        fileItem.write(file);  
                        System.out.println("上传成功");
                    } 
                }  
            }  
        }catch(FileSizeLimitExceededException e){  
            req.setAttribute("msg", "文件太大");  
        }catch(FileUploadException e){  
            e.printStackTrace();  
        }catch(Exception e){  
            e.printStackTrace();  
        } 
		
		
	}


}

    
    






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值