总的说图片上传有两种方式,一种是把图片文件写到数据库中,另一种是存到服务器文件目录中。写到数据库中的图片文件需要转换成二进制流的格式,占用数据库空间比较,适合少量图片的存储,比如说,系统中某些小图标,写到数据库中的优点是比较安全,不容易被用户不小心删除。

如果是大量的图片的存储通常的做法是保存到服务器的某个文件夹中。而完成上传有很多方式,可以采用流的方式,可以采用ftp的方式,这里采用fileupload方式。

随着系统规模的不同,对图片文件的处理方式也不尽相同。如果系统中图片的数量不是很大,直接把所有的图片存储到同一个目录下即可。如果图片的积累比较多,可以根据物资分类对图片进行相应的分类储存,这样会节省一些在磁盘中查找文件的时间。

图片上传到文件中,可以直接上传图片到目录中,也还可以将图片文件名、文件路径写入到数据库中,也可以在程序中动态的创建文件路径。如果公司中要求图片要用专门的服务器存放,这时候把文件路径写活还是比较合适的。一般的如果一种物资(物料)对应一张图片是比较容易处理的。如果对应多张图片,处理起来就需要配合循环使用。一方面,需要处理图片的动态显示,另一方面要检查图片文件命名是否重复。另外再图片处理(上传、删除、修改)的时候需要配合事务。

下面重点介绍一下使用fileupload方式实现图片上传的最基本的实现。

1、前端使用file标签:

<input name = "fileName" type ="file" class ="text1" size ="40" maxlength="40">

2、设置文件的enctype格式:multipart/form-data

<form name="itemForm"  target="_self" id="itemForm" method="post"  action="servlet/item/FileUploadServlet" enctype="multipart/form-data" >

关于enctype="multipart/form-data" 的说明:

在jsp中使用了该格式,对应的Servlet就不能使用request.getParameter()取得参数,要使用ServletFileUpload对象的parseRequest方法先把request对象中的数据解析,然后,使用解析出的元素的isFormField标志,配合getFieldName方法来获取数据。

3、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 File uploadPath;private File tempPath;@Overridepublic void init() throws ServletException {//在系统启动的时候,就开始初始化,在初始化时,检查上传图片的文件夹和存放临时文件的文件夹是否存在,如果不存在,就创建     //获取根目录对应的真实物理路径uploadPath = new File(getServletContext().getRealPath("upload"));System.out.println("uploadPath=====" + uploadPath);//如果目录不存在if (!uploadPath.exists()) {//创建目录uploadPath.mkdir();}//临时目录//File tempFile = new File(item.getName())构造临时对象tempPath = new File(getServletContext().getRealPath("temp"));if (!tempPath.exists()) {tempPath.mkdir();}//如果不显示调用父类方法,就不会有itemManager实例,因此会造成空指针super.init();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//从item_upload.jsp中拿取数据,因为上传页的编码格式跟一般的不同,使用的是enctype="multipart/form-data"//form提交采用multipart/form-data,无法采用req.getParameter()取得数据//String itemNo = req.getParameter("itemNo");//System.out.println("itemNo======" + itemNo);/********************************使用 FileUpload 组件解析表单********************///DiskFileItemFactory:创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。DiskFileItemFactory factory = new DiskFileItemFactory();// maximum size that will be stored in memoryfactory.setSizeThreshold(4096);// the location for saving data that is larger than getSizeThreshold()factory.setRepository(tempPath);//ServletFileUpload:负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。//在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小,//那么文件将被保存到磁盘上,存储为 DiskFileItemFactory 指定目录中的临时文件。//等文件数据都接收完毕后,ServletUpload再从文件中将数据写入到上传文件目录下的文件中ServletFileUpload upload = new ServletFileUpload(factory);// maximum size before a FileUploadException will be thrownupload.setSizeMax(1000000 * 20);/*******************************解析表单传递过来的数据,返回List集合数据-类型:FileItem***********/try {List fileItems = upload.parseRequest(request);String itemNo = "";//Iterator iter = fileItems.iterator()取其迭代器//iter.hasNext()检查序列中是否还有元素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.LOGfileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());// 保存文件在服务器的物理磁盘中:第一个参数是:完整路径(不包括文件名)第二个参数是:文件名称    //item.write(file);//修改文件名和物料名一致,且强行修改了文件扩展名为gif//item.write(new File(uploadPath, itemNo + ".gif"));//将文件保存到目录下,不修改文件名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("上传失败!");}    }}

该类继承了AbstractItemServlet: 所有物料Servlet的抽象父类,负责实例化ItemManager

/*** 所有物料Servlet的抽象父类,负责实例化ItemManager* @author LiMin**/
public abstract class AbstractItemServlet extends HttpServlet {//虽然不是线程安全的,但是如果只读的话,是不会有错误的protected ItemManager itemManager = null;@Overridepublic void init() throws ServletException {itemManager = new  ItemManagerImpl()}}

ItemManagerImpl是实现了ItemManager接口的子类。这种设计模式有一个问题,有待遇优化,但这里为了说明图片上传,不多做无关的赘述。

总结:

关于init()初始化方法:

在Servlet初始化的时候,就动态创建目录,这里是把一个upload和临时文件tempPath创建到了tomcat的webapps下的项目的跟目录中。

值得注意点是这里需要显示调用super.init()方法(super不是父类对象的引用,但是负责父类的方法的调用),否则,可能会造成该类的空指针。

上传大致分三步执行:使用 FileUpload 组件解析表单;解析表单传递过来的数据,返回List集合数据-类型:FileItem;最后上传图片。

使用FileItem的isFormField()方法判断是普通文本还是文件;

使用FileItem.write(new File(uploadPath, fileName))上传文件,第一个参数是:完整路径(不包括文件名)第二个参数是:文件名称;

处理普通文本数据:

if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
 }

上传是很多年比较成熟的技术,有很多已经封装好的,我们平时的项目中可以直接拿来用,但是了解一些基本的原理是必不可少的。

java上传图片文件相关推荐

  1. java 上传图片 / 文件添加水印(png/jpg/pdf)

    png/jpg/pdf文件上传时添加水印 最近在公司遇到了一个还算是比较复杂的业务吧,因为这个业务是给png格式;jpg格式;还有pdf格式的文件添加水印,其实图片格式的文件用java做水印还是比较好 ...

  2. java上传图片 文件损坏_Java Servlet图像上传损坏(灰色底部)

    我们有一个接受图像上传的servlet.有时,当上传源于我们的iPhone客户端(脆弱的连接)时,保存的图像可能会部分或完全变灰.我怀疑这是由于连接过早终止,servlet最终处理的是不完整的图像. ...

  3. 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  4. Android 上传图片实例,java上传图片接口

    1.完整上传图片代码方法: private static final int TIME_OUT = 10*1000; //超时时间 private static final String CHARSE ...

  5. java上传图片到target目录,jsp如何访问target里的图片路径

    java上传图片到target目录,jsp如何访问target里的图片路径 昨天有个同学在做springmvc的图片上传,上传成功了却无法从网页中访问,我看了看上传后的路径,它用的idea编辑器,图片 ...

  6. 利用Spring MVC 上传图片文件

    本文转自:http://amcucn.iteye.com/blog/264457.感谢作者 近日在工作当中,需要用到上传图片的功能,然而自己平时学习的时候只会使用struts的上传功能,但因为项目并没 ...

  7. 【java】 文件批量下载并压缩为zip压缩包

    [java] 文件批量下载并压缩为zip压缩包 java常用的压缩技术 java中常见实现压缩与解压 业务场景 代码实现 注意点 java常用的压缩技术 常见的压缩格式有很多种,例如:zip.rar. ...

  8. java上传图片怎么查看,Java上传图片并查看

    Java上传图片并查看 一.配置tomcat: 在tomcat的server.xml配置文件的标签下加以下内容: 二.编写上传图片.解析图片路径代码: //上传照片 public String upl ...

  9. 微信公众号-java上传图片素材到微信服务器基于事件推送两条消息

    微信公众号-java上传图片素材到微信服务器&基于事件推送两条消息 场景:基于微信扫码登录/关注事件,向用户推送两条消息. 分析:翻阅了微信开发者文档和一些其他资料发现,公众号针对用户关注/扫 ...

最新文章

  1. Linux篇---ftp服务器的搭建
  2. Windows学习总结(3)——成为电脑高手必备的cmd命令大全
  3. 判断js对象是否拥有某属性
  4. IDEA+Hadoop运行TriangleCount程序
  5. C#interface定义及使用浅析
  6. No authorization to log on as a Trusted System
  7. python可视化水平双向箭头_python数据可视化第二弹
  8. android 动态设置View的高度和宽度,ViewTreeObserver使用
  9. Qt实现全屏下玫瑰花(含详细注释)
  10. 现在很多人都做自媒体,谈谈个人的一些想法
  11. DSP sawtooth锯齿波与square方波matlab产生(M2.2)
  12. python文件处理小方法
  13. java mail(转贴)//从哪里找到忘记了,不过绝对不是自己写的
  14. java一寸是多少像素_一寸照片的尺寸是多少像素
  15. 【平衡小车制作】(二)电机驱动(超详解)
  16. c语言输出漏斗图形7层,ECharts 教程 漏斗图属性与实例介绍 - 闪电教程JSRUN
  17. 如何应对云安全技术遇到的挑战?可从这三点入手
  18. 前端学习CSS3(day3)盾牌案例
  19. KDD2020|PinnerSage:Pinterest推荐中的多模式用户嵌入框架
  20. DeepLog: Anomaly Detection and Diagnosis from System Logs through Deep Learning

热门文章

  1. 搞清楚C语言的网络函数族hton ntoh 以及大小端记忆法
  2. 你说的H5到底是什么,跟Html有什么关系,能吃吗
  3. 网络安全关于Windows下BAT脚本使用
  4. 物流面单 标签纸打印机设置
  5. 求职之C++小知识点整理
  6. 布袋除尘器过滤风速多少_布袋式除尘器过滤风速一般多大
  7. 统一软件过程的基本概念
  8. 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)
  9. php输入框里的提示文字,h5和css3制作带提示文字的输入框
  10. Xftp无法与192.168.xx.xx连接 SSH服务器拒绝了密码。请再试一次。