版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuezhuo_752/article/details/54619352
图片上传到文件中,可以直接上传图片到目录中,也还可以将图片文件名、文件路径写入到数据库中,也可以在程序中动态的创建文件路径。
参看:http://blog.csdn.net/lmdcszh/article/details/9201173
package com.ioif.wha.imageUpload;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
private File uploadPath;
private File tempPath;
public void init() throws ServletException {
// 在系统启动的时候,就开始初始化,检查上传图片的文件夹和存放临时文件的文件夹是否存在,如果不存在,就创建
//获取根目录对应的真实物理路径
uploadPath = new File(getServletContext().getRealPath("upload"));
System.out.println("uploadPath======="+uploadPath);
//如果目录不存在
if(!uploadPath.exists()){
//创建目录
uploadPath.mkdir();
}
//临时目录
// File tempFile = new File(item.getName())构造临时对象
tempPath = new File(getServletContext().getRealPath("temp"));
System.out.println("tempPath======="+tempPath);
if(!tempPath.exists()){
tempPath.mkdir();
}
//如果不显示调用父类方法,就不会有itemManager实例,因此会造成空指针
super.init();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("---doPost--");
//从item_upload.jsp中拿取数据,因为上传页的编码格式跟一般的不同,使用的是enctype="multipart/form-data"
// form提交采用multipart/form-data,无法采用req.getParameter()取得数据
// String itemNo = req.getParameter("itemNo");
// System.out.println("itemNo======" + itemNo);
/********************************使用 FileUpload 组件解析表单********************/
//DiskFileItemFactory:创建FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值
factory.setSizeThreshold(4096);//4kb
//设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的 File getRespository() 方法
factory.setRepository(tempPath);
//ServletFileUpload:负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。
//在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小,
//那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。
//等文件数据都接收完毕后,ServletUpload再从文件中将数据写入到上传文件目录下的文件中
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1000000 * 20);
/*******************************解析表单传递过来的数据,返回List集合数据-类型:FileItem***********/
try{
List<FileItem> fileItems = upload.parseRequest(request);
String itemNo = "";
//Iterator iter = fileItems.iterator()取其迭代器
//iter.hasNext()检查序列中是否还有元素
System.out.println("---fileItems--"+fileItems.size());
for (Iterator iter = fileItems.iterator();iter.hasNext(); ) {
//获取序列中的下一个元素
FileItem item = (FileItem) iter.next();
System.out.println("---5555--");
//判断是文件还是文本信息
//是普通的表单输入域
if(item.isFormField()){
if("itemNo".equalsIgnoreCase(item.getFieldName())){
itemNo = item.getString();
System.out.println("itemNo======="+itemNo);
}
}
//是否为input="type"输入域
if(!item.isFormField()){
//上传文件的名称和完整路径
String fileName = item.getName();
long size = item.getSize();
//判断是否选择了文件
if(fileName == null || fileName.equals("") && size == 0){
continue;
}
//截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
fileName = fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length());
System.out.println("fileName======="+fileName);
// 保存文件在服务器的物理磁盘中:第一个参数是:完整路径(不包括文件名)第二个参数是:文件名称
//item.write(file);
//修改文件名和物料名一致,且强行修改了文件扩展名为gif
//item.write(new File(uploadPath, itemNo + ".gif"));
//将文件保存到目录下,不修改文件名
item.write(new File(uploadPath, fileName));
}
}
}catch(Exception e){
e.printStackTrace();
// throw new ApplicationException("上传失败", null);
}
}
}
注:
解析表单传递过来的数据,通过upload.parseRequest(request)返回List集合数据-类型:FileItem,测试时,request正常提交了表单,但还是出现parseRequest(request)为空,list.size()为0的情况,问题可能出在web.xml文件上,和filter有关,配置struts那里
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样所有的文件都会被struts拦截,显然这是不恰当的,我就改成了下面这样。
<url-pattern>*.do,*.action</url-pattern>
然后上传功能就又恢复正常了
参看:http://blog.csdn.net/en_reading/article/details/52486804