上传图片的实现

  无论是上传图片还是制作各种图表,市场上都有很多第三方控件,而且功能都也做得很不错,当我们需要做这样一个任务时,完全没有必要自己去写一个。我们要学会站在巨人的肩膀上。我们不要想着完全掌握这些第三方控件的使用,大可以理解其中一二,会用就可以了。如果有研究的必要的时候,再深入学习。也就是米老师说的“不怕不知道,就怕不知道”。

  现在我整理了一下关于上传图片的实现思路和代码。主要使用第三方控件:Apache Commons FileUpload


1.页面

上传图片的实现_第1张图片

如图:我们需要给该物料上传一些必要的图片。


2.实现思路

  使用Apache Commons FileUpload,我们需要先引入两个jar包,如图:

上传图片的实现_第2张图片


上传的逻辑:上传基本可以有两种实现:第一种就是上传的图片放在服务器上的某个文件夹下,图片名称存入数据表中;第二种就是将上传的图片以二进制方式写入数据库中的大字段里。这里主要介绍第一种实现方法。

  第一步:创建上传文件在服务器上的目录,如果文件太大的话,我们需要设置一个临时目录.当然如果存在,就不再创建。

  第二步:做上传前的验证:比如上传文件的类型限制,上传文件的大小限制

  第三步:使用第三方类,获取文件列表,判断是普通的表单输入域,还是不是,若不为普通的表单输入域,需要获取到文件名,根据路径写入文件夹(使用流),然后将文件名称保存到数据库中。

  需要注意点:上传图片时表单的属性需要添加 enctype="multipart/form-data" 而且必须是post提交方式。


3.实现代码

jsp:

<%@ page language="java" contentType="text/html; charset=GB18030"
	pageEncoding="GB18030"%>
<%@ page import="com.bjpowernode.drp.basedata.domain.*" %>	

<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
		+ request.getServerName() + ":" + request.getServerPort()
		+ path + "/";
	Item item = (Item)request.getAttribute("Item");
	
%>

	
	    
		物料维护
		
		
		
	

	
		
 
  基础数据管理>>物料维护>>上传物料图片

物料代码: 
<%=item.getItemNo() %>
物料名称: 
<%=item.getItemName() %>
物料规格: 
<%=item.getSpec() %>
物料型号: 
<%=item.getPattern() %>
类别: 
<%=item.getItemCategory().getName() %>
计量单位: 
<%=item.getItemUnit().getName() %>
图片: 
*选择图片: 

    

FileUploadServlet:

package com.bjpowernode.drp.basedata.web;

import java.io.File;
import java.io.IOException;
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;

import com.bjpowernode.drp.basedata.manager.ItemManager;
import com.bjpowernode.drp.basedata.manager.ItemManagerImpl;
import com.bjpowernode.drp.util.ApplicationException;

public class FileUploadServlet extends AbstractItemServlet {

	//private ItemManager itemManager;
	
	private File uploadPath;
	
	private File tempPath;
	
	public void init() throws ServletException {
		//主要完成创建目录和临时目录
		uploadPath = new File(getServletContext().getRealPath("upload"));
		if(!uploadPath.exists()){
			uploadPath.mkdir();
			
		}
		System.out.println("uploadPath=====" + uploadPath);
		
		tempPath = new File(getServletContext().getRealPath("temp"));
		if(!tempPath.exists()){
			tempPath.mkdir();
		}
		//显示调用父类的init方法
		super.init();
		//itemManager = new ItemManagerImpl();
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(4096); // maximum size that will be stored in memory
		
		//如果上传的文件大小超过4096,则设置一个临时存储位置,也就是tempPath
		factory.setRepository(tempPath); 
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(1000000 * 20);  //上传文件Maximum size
		
		try {
			//获取上传的文件列表
			List fileItems = upload.parseRequest(request);
			String itemNo = "";
			for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
				FileItem item = (FileItem) iter.next();
				
				//是普通的表单输入域,则取出itemNo
				if(item.isFormField()) {
					if ("itemNo".equals(item.getFieldName())) {
						itemNo = item.getString();
					}
				}
				//不是普通的表单输入域
				//获取到文件名,根据路径写入文件夹
				//并将文件名保存到数据库中
				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());
					item.write(new File(uploadPath, fileName));
					itemManager.uploadItemImage(itemNo, fileName);
				}
			}
			response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet");
		} catch (Exception e) {
			e.printStackTrace();
			throw new ApplicationException("上传失败!");
		}
	}




}

Manager:

public void uploadItemImage(String itemNo, String fileName) {
		Connection conn = null;
		try{
			conn = DBUtil.getConnection();
			Item item = itemDao.findItemById(conn, itemNo);
			item.setFile_name(fileName);
			itemDao.modifyItem(conn, item);			
		}catch(Exception e){
			throw new ApplicationException("上传物料图片失败!");
		}finally{
			DBUtil.Close(conn);
		}

Dao:

public void modifyItem(Connection conn, Item item) {
		String sql = "update t_items set item_name = ?,spec = ?,pattern = ?,item_category_id = ?,item_unit_id = ?,file_name = ? " ;
	     sql += "where item_no = ?";
		PreparedStatement pstmt = null;
		try{
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(7, item.getItemNo());
			pstmt.setString(1, item.getItemName());
			pstmt.setString(2, item.getSpec());
			pstmt.setString(3, item.getPattern());
			pstmt.setString(4, item.getItemCategory().getId());
			pstmt.setString(5, item.getItemUnit().getId());
			pstmt.setString(6, item.getFile_name());
			pstmt.executeUpdate();
		}catch(SQLException e){ 
			e.printStackTrace();
			
			throw new ApplicationException("修改物料失败!");
		}finally{
			DBUtil.Close(pstmt);
		}
		
	}

	@Override
	public Item findItemById(Connection conn, String itemNo) {
		//逻辑思路:
		//1.由conn产生preparedStatement,传入sql语句
		//2.若需要传参,则设置参数
		//3.执行,将查询结果放在ResultSet中
		//4.将数据从ResultSet中读出放到Item实体中返回
		
		StringBuffer sql = new StringBuffer();
		sql.append("select a.item_no,a.item_name,a.spec,a.pattern,a.item_category_id,b.name as item_category_name,")
		   .append("a.item_unit_id,c.name as item_unit_name ,a.file_name ")
		   .append("from t_items a ,t_data_dict b ,t_data_dict c ")
		   .append("where a.item_category_id = b.id and a.item_unit_id = c.id and a.item_no = ?");
		
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Item item = null;
		try {
			pstmt = conn.prepareStatement(sql.toString());
			pstmt.setString(1, itemNo);
			rs = pstmt.executeQuery();
			if(rs.next()){
				//简单类型的属性
				item = new Item();
				item.setItemNo(rs.getString("item_no"));
				item.setItemName(rs.getString("item_name"));
				item.setSpec(rs.getString("spec"));
				item.setPattern(rs.getString("pattern"));
				
				//对象类型的属性
				ItemCategory itemCategory =  new ItemCategory();
				itemCategory.setId(rs.getString("item_category_id"));
				itemCategory.setName(rs.getString("item_category_name"));
				item.setItemCategory(itemCategory);
				
				ItemUnit itemUnit = new ItemUnit();
				itemUnit.setId(rs.getString("item_unit_id"));
				itemUnit.setName(rs.getString("item_unit_name"));
				item.setItemUnit(itemUnit);
				
				item.setFile_name(rs.getString("file_name"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new ApplicationException("根据物料代码查询出错,物料代码【" + itemNo+ "】");
		}finally{
			DBUtil.Close(rs);
			DBUtil.Close(pstmt);
		}
		return item;
	}

总结:主要是通过学习Apache Commons FileUpload如何使用来了解第三方控件的使用。

你可能感兴趣的:(J2EE)