上传图片的实现

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

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


1.页面


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


2.实现思路

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



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

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

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

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

  需要注意点:上传图片时表单的属性需要添加 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");
	
%>
<html>
	<head>
	    <base href="<%=basePath %>">
		<title>物料维护</title>
		<link rel="stylesheet" href="../style/drp.css">
		<script src="../script/client_validate.js"></script>
		<script language="javascript">

</script>
	</head>

	<body class="body1">
		<form name="itemForm" target="_self" id="itemForm" action="servlet/item/FileUploadServlet" method="post" enctype="multipart/form-data">
			<input type="hidden" name="itemNo" value="<%=item.getItemNo()%>">
			<div align="center">
				<table width="95%" border="0" cellspacing="2" cellpadding="2">
					<tr>
						<td>
							 
						</td>
					</tr>
				</table>
				<table width="95%" border="0" cellspacing="0" cellpadding="0"
					height="8">
					<tr>
						<td width="522" class="p1" height="2" nowrap>
							<img src="images/mark_arrow_03.gif" width="14" height="14">
							 
							<b>基础数据管理>>物料维护>>上传物料图片</b>
						</td>
					</tr>
				</table>
				<hr width="97%" align="center" size=0>
				<table width="95%" border="0" cellpadding="0" cellspacing="0">
					<tr>
						<td height="29">
							<div align="right">
								物料代码: 
							</div>
						</td>
						<td>
							<%=item.getItemNo() %>
						</td>
					</tr>
					<tr>
						<td height="26">
							<div align="right">
								物料名称: 
							</div>
						</td>
						<td>
							<%=item.getItemName() %>
						</td>
					</tr>
					<tr>
						<td height="26">
							<div align="right">
								物料规格: 
							</div>
						</td>
						<td>
							<%=item.getSpec() %>
						</td>
					</tr>
					<tr>
						<td height="26">
							<div align="right">
								物料型号: 
							</div>
						</td>
						<td>
							<%=item.getPattern() %>
						</td>
					</tr>
					<tr>
						<td height="26">
							<div align="right">
								类别: 
							</div>
						</td>
						<td>
							<%=item.getItemCategory().getName() %>
						</td>
					</tr>
					<tr>
						<td height="26">
							<div align="right">
								计量单位: 
							</div>
						</td>
						<td>
							<%=item.getItemUnit().getName() %>
						</td>
					</tr>
					<tr>
						<td height="74">
							<div align="right">
								图片: 
							</div>
						</td>
						<td>
							<img src="upload/<%=item.getFile_name() %>" width="85" height="49">
						</td>
					</tr>
					<tr>
						<td width="22%" height="29">
							<div align="right">
								<font color="#FF0000">*</font>选择图片: 
							</div>
						</td>
						<td width="78%">
							<input name="fileName" type="file" class="text1" size="40" maxlength="40">
						</td>
					</tr>
				</table>
				<hr width="97%" align="center" size=0>
				<div align="center">
					<input name="btn_upload" class="button1" type="submit"
						id="btn_upload" value="上传">
					    
					<input name="btnBack" class="button1" type="button" id="btnBack"
						value="返回" onClick="history.go(-1)">
				</div>
			</div>
		</form>
	</body>
</html>

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如何使用来了解第三方控件的使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值