简单实现java上传图片文件功能

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

如果是大量的图片的存储通常的做法是保存到服务器的某个文件夹中。而完成上传有很多方式,可以采用流的方式,可以采用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; 

 @Override
 public 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 memory
  factory.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 thrown
  upload.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.LOG
     fileName = 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; 

 @Override
 public 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();
 }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • JSP上传图片产生 java.io.IOException: Stream closed异常解决方法
  • java异步上传图片示例
  • java实现上传图片进行切割的方法
  • Java实现给网站上传图片盖章的方法
  • spring(java,js,html) 截图上传图片实例详解
  • java webApp异步上传图片实现代码
  • Java中上传图片压缩处理的方法示例
  • java实现上传图片并压缩图片大小功能
  • React+ajax+java实现上传图片并预览功能
  • Java Servlet上传图片到指定文件夹并显示图片
(0)

相关推荐

  • spring(java,js,html) 截图上传图片实例详解

    html <#-- 上传头像 测试页 使用imgareaselect 插件 --> 最后 上传了这个插件 共学习参考 <link rel="stylesheet" type="text/css" href="${frontRes}/imgareaselect/css/imgareaselect-animated.css" /> <link rel="stylesheet" type="t

  • Java实现给网站上传图片盖章的方法

    本文实例讲述了Java实现给网站上传图片盖章的方法.分享给大家供大家参考.具体如下: 最近无聊,上了一会校友录,觉的校友录的图片都会加入一个章,呵呵,自己也就做了一个,不过只适合jpg格式.发出来给大家研究研究.欢迎讨论! 很老的代码了 /************************************************ * <p>java对图片的操作(只能使用jpg)</p> * 对图片的签章<br> * 对图片的缩图<br> * <p

  • Java中上传图片压缩处理的方法示例

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定. 在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的. package test; import java.io.*; import java.util.Date; import java.awt.*; import java.aw

  • java webApp异步上传图片实现代码

    如何实现java webApp异步上传图片,先了解以下几个问题: 1.图片上传: 2.图片上传预览: 3.上传图片更改地址异步添加到数据库: 主要内容 本示例主要采用纯HTML前端和JavaScript代码作工具,查询有关demo其实现图片上传的代码范例如下: (1)点击上传图片的div代码: <div id="div1" class="photo"> <input type="file" id="choose&quo

  • Java Servlet上传图片到指定文件夹并显示图片

    在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/image)的图片.主要步骤如下: 步骤一:上传页面uploadphoto.jsp 需要注意两个问题: 1.form 的method必须是post的,get不能上传文件, 还需要加上enctype="multipart/form-data" 表示提交的数据是二进制文件. 2.需要提供type=&

  • React+ajax+java实现上传图片并预览功能

    之前有在网上找ajax上传图片的资料,大部分的人写得都是用jQuery,但是在这里用JQuery就大才小用了,所以我就自己写了,先上图. 由上图,首先点击上面的选择文件,在选择图片之后,将会自动上传图片到服务器,并且返回图片名字和图片在服务器的路径,然后在页面显示文件名字和图片. 源码:ajax上传预览 React中: import React from 'react'; import Http from './http' const URL = 'http://localhost:8080/f

  • java实现上传图片进行切割的方法

    本文实例讲述了java实现上传图片进行切割的方法.分享给大家供大家参考.具体分析如下: 为什么我要进行上传的图片进行切割呢,我这个项目的图片是部门logo,每个部门都可以选择不同的logo,但是要应对浏览器的兼容以及拉伸,我选择了把一张图片切成左.中.右和剩下的部分,因为左边和中变可能会有图案或者字所以不能拉伸,拉伸的只是右边的部分,剩下的部分自适应就可以了.所以用了javax的ImageReader来操作.最后以blob类型保存数据库中. 首先要在form表单里面写上enctype="mult

  • JSP上传图片产生 java.io.IOException: Stream closed异常解决方法

    在做 jsp 上传图片时,把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: Stream closed ... 百思不得其解,翻出 jsp 转成 servlet 后的代码.如下(很很的醒目一下):

  • java实现上传图片并压缩图片大小功能

    Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量.还支持对一个目录的所有图片进行批量处理操作. 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例. 另外值得一提的是,Thumbnailator至今仍不断更新,怎么样,感觉很有保障吧! 下面我们介绍下如何使用Thu

  • java异步上传图片示例

    复制代码 代码如下: final File imageFile = new File(getCacheDir().getPath() + "/img/" + p.image); image.setVisibility(View.GONE); view.findViewById(R.id.imageLoading).setVisibility(View.VISIBLE); (new AsyncTask<Void, Void, Bitmap>() {     @Override

随机推荐