上传图片的实现

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

  现在我整理了一下关于上传图片的实现思路和代码。主要使用第三方控件: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");%>
物料维护
基础数据管理>>物料维护>>上传物料图片

物料代码: <%=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();}@Overrideprotected 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,则设置一个临时存储位置,也就是tempPathfactory.setRepository(tempPath); ServletFileUpload upload = new ServletFileUpload(factory);upload.setSizeMax(1000000 * 20);  //上传文件Maximum sizetry {//获取上传的文件列表List fileItems = upload.parseRequest(request);String itemNo = "";for (Iterator iter = fileItems.iterator(); iter.hasNext();) {FileItem item = (FileItem) iter.next();//是普通的表单输入域,则取出itemNoif(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.LOGfileName = 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);}}@Overridepublic 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 blocke.printStackTrace();throw new ApplicationException("根据物料代码查询出错,物料代码【" + itemNo+ "】");}finally{DBUtil.Close(rs);DBUtil.Close(pstmt);}return item;}

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部