javaweb实现图片文件上传

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/yuezhuo_752/article/details/54619352