无论是上传图片还是制作各种图表,市场上都有很多第三方控件,而且功能都也做得很不错,当我们需要做这样一个任务时,完全没有必要自己去写一个。我们要学会站在巨人的肩膀上。我们不要想着完全掌握这些第三方控件的使用,大可以理解其中一二,会用就可以了。如果有研究的必要的时候,再深入学习。也就是米老师说的“不怕不知道,就怕不知道”。
现在我整理了一下关于上传图片的实现思路和代码。主要使用第三方控件: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");
%>
物料维护
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;
}