博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习——apache commons fileupload实现上传
阅读量:4262 次
发布时间:2019-05-26

本文共 5811 字,大约阅读时间需要 19 分钟。

      在实际工作中,我们总是会使用到上传图片的功能,至于java如何实现图片的上传,我们没必要去自己写一套上传的代码,因为上传的技术已经相当成熟,我们只要从网上找一个例子,调试好,然后集成到自己的项目中就行了,非常方便。那么今天,我就跟大家分享一下我通过apache commons fileupload实现的上传。


一、业务了解

      首先,我们要清楚,每个上传的图片都要与数据库中的一条记录对应。因此,也就产生了多种存取方式。

将文件存放在tomcat(或其他)服务器中,然后将其名字改为该记录的主键名。
将文件存放在tomcat(或其他)服务器中,然后将其名字存到相应的记录中。
将文件存放在数据库中(不常用),通常我们只将系统自带的一些图片存在数据库中。

      此次上传图片采用的方法二,只是将上传的图片名称保存到数据库中,而将上传的图片保存至tomcat服务器中,保存的目录是在代码中自动创建的。

二、开发环境搭建

需要下载的jar包,下载完成后,将其导入到java项目中。如图

这里写图片描述

三、上传的实现

      让我们看看java是怎么实现上传的。这里我们采用的是中的model2模式,也就是java中的mvc模式,这里我们将上传的实现现在Servlet中,其继承自httpServlet类。

1、item_upload.jsp页面

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><%@ page import="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() %>
图片: 
*选择图片: 

    

2、处理上传文件的FileUploadServlet类

public class FileUploadServlet extends HttpServlet {
private ItemManager itemManager; private File uploadPath; private File tempPath; // 用于存放临时文件的目录 public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ //使用Apache文件上传组件处理文件上传步骤: //1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 文件大于此临界值时,采用临时文件 factory.setSizeThreshold(4096); // 采用临时文件时,的临时文件目录 factory.setRepository(tempPath); //创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); //设置上传文件大小的上限,-1表示无上限 upload.setSizeMax(1000000 * 20); try { //上传文件,并解析出所有的表单字段,包括普通字段和文件字段 List fileItems = upload.parseRequest(req); //用来存放物料代码 String itemNo = ""; //循环将所有的文件上传 for (Iterator iter = fileItems.iterator(); iter.hasNext();) { FileItem item = (FileItem) iter.next(); //是普通的表单输入域 if(item.isFormField()) { //得到物料代码 if ("itemNo".equals(item.getFieldName())) { itemNo = item.getString(); } } //是否为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()); //保存文件,其实就是把缓存里的数据写到目标路径下 item.write(new File(uploadPath, fileName)); //调用itemManager对象将物料代码和其图片名称存入数据库 itemManager.uploadItemImage(itemNo,fileName); } } //重定向 res.sendRedirect(req.getContextPath() + "/servlet/item/SearchItemServlet"); } catch (Exception e) { e.printStackTrace(); throw new ApplicationException("上传失败!"); } } public void init() throws ServletException { uploadPath = new File(getServletContext().getRealPath("upload")); System.out.println("uploadPath=====" + uploadPath); //如果目录不存在 if (!uploadPath.exists()) { //创建目录 uploadPath.mkdir(); } //临时目录 tempPath = new File(getServletContext().getRealPath("temp")); if (!tempPath.exists()) { tempPath.mkdir(); } itemManager=new ItemManagerImpl(); }}

四、总结

      此代码也是从网上找的,然后改了改。我觉得这就够了,我们需要站在巨人的肩膀上,利用现有的资源,达到自己的目的。当然,我们会在以后的学习过程中给大家介绍java实现下载等,请大家继续关注。

你可能感兴趣的文章
linux网络协议栈(六)传输层 (3)UDP协议 3)报文发送 send/sendto/sendmsg
查看>>
linux网络协议栈(六)传输层 (3)UDP协议 4)报文接收 recv/recvfrom/recvmsg
查看>>
linux网络协议栈(六)传输层 (3)UDP协议 5)传输层框架小节
查看>>
linux的线程(posix thread)
查看>>
多路复用之epoll
查看>>
ET模式下epoll编程需要注意的问题
查看>>
linux的信号(signal)
查看>>
Nagle算法与TCP_NODELAY和TCP_CORK
查看>>
netstat常用命令
查看>>
linux内核TCP相关参数解释
查看>>
HTTP协议的详解
查看>>
HTTP快速入门
查看>>
网络编程常见问题
查看>>
lua的正则表达式之模式匹配(转)
查看>>
c++的map总结
查看>>
boost多线程库之准备动作
查看>>
gcc和boost的升级步骤(非root权限)
查看>>
自己编写Python连接MySQL的支持
查看>>
掰开揉碎机器学习系列-决策树(1)-ID3决策树
查看>>
python的引用和浅拷贝和p深拷贝
查看>>