您的位置:首页 > 编程语言 > Java开发

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

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

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

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

Servlet3.0实现文件上传

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

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();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐