本文共 5811 字,大约阅读时间需要 19 分钟。
在实际工作中,我们总是会使用到上传图片的功能,至于java如何实现图片的上传,我们没必要去自己写一套上传的代码,因为上传的技术已经相当成熟,我们只要从网上找一个例子,调试好,然后集成到自己的项目中就行了,非常方便。那么今天,我就跟大家分享一下我通过apache commons fileupload实现的上传。
首先,我们要清楚,每个上传的图片都要与数据库中的一条记录对应。因此,也就产生了多种存取方式。
将文件存放在tomcat(或其他)服务器中,然后将其名字改为该记录的主键名。
将文件存放在tomcat(或其他)服务器中,然后将其名字存到相应的记录中。
将文件存放在数据库中(不常用),通常我们只将系统自带的一些图片存在数据库中。
此次上传图片采用的方法二,只是将上传的图片名称保存到数据库中,而将上传的图片保存至tomcat服务器中,保存的目录是在代码中自动创建的。
需要下载的jar包,下载完成后,将其导入到java项目中。如图
让我们看看java是怎么实现上传的。这里我们采用的是中的model2模式,也就是java中的mvc模式,这里我们将上传的实现现在Servlet中,其继承自httpServlet类。
<%@ 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"); %>物料维护
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实现下载等,请大家继续关注。