java使用smartupload组件实现文件上传的方法

   2015-06-24 0
核心提示:这篇文章主要介绍了java使用smartupload组件实现文件上传的方法,对比分析了使用组件与不使用组件实现文件上传的区别,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了java使用smartupload组件实现文件上传的方法。分享给大家供大家参考。具体分析如下:

文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,这里主要说明smartupload组件上传。

在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传的原理的?

废话不多说直接上代码:

复制代码 代码如下:
import java.io.*;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadTools {
    private HttpServletRequest request = null; // 取得HttpServletRequest对象
    private List<FileItem> items = null; // 保存全部的上传内容
    private Map<String, List<String>> params = new HashMap<String, List<String>>();    // 保存所有的参数
    private Map<String, FileItem> files = new HashMap<String, FileItem>();
    private int maxSize = 3145728;                 // 默认的上传文件大小为3MB,3 * 1024 * 1024
    public FileUploadTools(HttpServletRequest request, int maxSize,
            String tempDir) throws Exception {    // 传递request对象、最大上传限制、临时保存目录
        this.request = request;                 // 接收request对象
        DiskFileItemFactory factory = new DiskFileItemFactory(); // 创建磁盘工厂
        if (tempDir != null) {                     // 判断是否需要进行临时上传目录
            factory.setRepository(new File(tempDir)); // 设置临时文件保存目录
        }
        ServletFileUpload upload = new ServletFileUpload(factory); // 创建处理工具
        if (maxSize > 0) {                        // 如果给的上传大小限制大于0,则使用新的设置
            this.maxSize = maxSize;
        }
        upload.setFileSizeMax(this.maxSize);     // 设置最大上传大小为3MB,3 * 1024 * 1024
        try {
            this.items = upload.parseRequest(request);// 接收全部内容
        } catch (FileUploadException e) {
            throw e;                             // 向上抛出异常
        }
        this.init();                             // 进行初始化操作
    }
    private void init() {                        // 初始化参数,区分普通参数或上传文件
        Iterator<FileItem> iter = this.items.iterator();
        IPTimeStamp its = new IPTimeStamp(this.request.getRemoteAddr()) ;
        while (iter.hasNext()) {                // 依次取出每一个上传项
            FileItem item = iter.next();         // 取出每一个上传的文件
            if (item.isFormField()) {             // 判断是否是普通的文本参数
                String name = item.getFieldName(); // 取得表单的名字
                String value = item.getString(); // 取得表单的内容
                List<String> temp = null;         // 保存内容
                if (this.params.containsKey(name)) { // 判断内容是否已经存放
                    temp = this.params.get(name); // 如果存在则取出
                } else {                        // 不存在
                    temp = new ArrayList<String>(); // 重新开辟List数组
                }
                temp.add(value);                 // 向List数组中设置内容
                this.params.put(name, temp);     // 向Map中增加内容
            } else {                             // 判断是否是file组件
                String fileName = its.getIPTimeRand()
                    + "." + item.getName().split("\\.")[1];
                this.files.put(fileName, item); // 保存全部的上传文件
            }
        }
    }
    public String getParameter(String name) {     // 取得一个参数
        String ret = null;                         // 保存返回内容
        List<String> temp = this.params.get(name); // 从集合中取出内容
        if (temp != null) {                        // 判断是否可以根据key取出内容
            ret = temp.get(0);                     // 取出里面的内容
        }
        return ret;
    }
    public String[] getParameterValues(String name) { // 取得一组上传内容
        String ret[] = null;                     // 保存返回内容
        List<String> temp = this.params.get(name); // 根据key取出内容
        if (temp != null) {                        // 避免NullPointerException
            ret = temp.toArray(new String[] {});// 将内容变为字符串数组
        }
        return ret;                             // 变为字符串数组
    }
    public Map<String, FileItem> getUploadFiles() {// 取得全部的上传文件
        return this.files;                         // 得到全部的上传文件
    }
    public List<String> saveAll(String saveDir) throws IOException { // 保存全部文件,并返回文件名称,所有异常抛出
        List<String> names = new ArrayList<String>();
        if (this.files.size() > 0) {
            Set<String> keys = this.files.keySet(); // 取得全部的key
            Iterator<String> iter = keys.iterator(); // 实例化Iterator对象
            File saveFile = null;                 // 定义保存的文件
            InputStream input = null;             // 定义文件的输入流,用于读取源文件
            OutputStream out = null;             // 定义文件的输出流,用于保存文件
            while (iter.hasNext()) {            // 循环取出每一个上传文件
                FileItem item = this.files.get(iter.next()); // 依次取出每一个文件
                String fileName = new IPTimeStamp(this.request.getRemoteAddr())
                        .getIPTimeRand()
                        + "." + item.getName().split("\\.")[1];
                saveFile = new File(saveDir + fileName);     // 重新拼凑出新的路径
                names.add(fileName);            // 保存生成后的文件名称
                try {
                    input = item.getInputStream();             // 取得InputStream
                    out = new FileOutputStream(saveFile);     // 定义输出流保存文件
                    int temp = 0;                            // 接收每一个字节
                    while ((temp = input.read()) != -1) {     // 依次读取内容
                        out.write(temp);         // 保存内容
                    }
                } catch (IOException e) {         // 捕获异常
                    throw e;                    // 异常向上抛出
                } finally {                     // 进行最终的关闭操作
                    try {
                        input.close();            // 关闭输入流
                        out.close();            // 关闭输出流
                    } catch (IOException e1) {
                        throw e1;
                    }
                }
            }
        }
        return names;                            // 返回生成后的文件名称
    }
}

上面代码便可以完成无组件上传。

下面开始讲解smartupload

smartupload是由www.jspsmart.com网站开发的一套上传组件包,可以轻松的实现文件的上传及下载功能,smartupload组件使用简单、可以轻松的实现上传文件类型的限制、也可以轻易的取得上传文件的名称、后缀、大小等。

smartupload本身是一个系统提供的jar包(smartupload.jar),用户直接将此包放到classpath下即可,也可以直接将此包拷贝到TOMCAT_HOME\lib目录之中。

下面使用组件完成上传

单一文件上传:

复制代码 代码如下:
<html>
<head><title>smartupload组件上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<form action="smartupload_demo01.jsp" method="post" enctype="multipart/form-data">
    图片<input type="file" name="pic">
    <input type="submit" value="上传">
</form>
</body>
</html>

jsp代码:

smartupload_demo01.jsp

复制代码 代码如下:
<%@ page contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="com.jspsmart.upload.*" %>
<html>
<head><title>smartupload组件上传01</title></head>

<body>
 <%
    SmartUpload smart = new SmartUpload() ;
    smart.initialize(pageContext) ;    // 初始化上传操作
    smart.upload();        // 上传准备
    smart.save("upload") ;    // 文件保存
    out.print("上传成功");
%>

</body>
</html>

批量上传:

html文件


复制代码 代码如下:
<html>
<head><title>smartupload组件上传02</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<form action="smartupload_demo02.jsp" method="post" enctype="multipart/form-data">
    图片<input type="file" name="pic1"><br>
    图片<input type="file" name="pic2"><br>
    图片<input type="file" name="pic3"><br>
    <input type="submit" value="上传">
    <input type="reset" value="重置">
</form>
</body>
</html>

jsp代码

smartupload_demo02.jsp

复制代码 代码如下:
<%@ page contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="com.jspsmart.upload.*"%>
<%@ page import="com.zhou.study.*"%>
<html>
<head><title>smartupload组件上传02</title></head>
<body>
<%
    SmartUpload smart = new SmartUpload() ;
    smart.initialize(pageContext) ;    // 初始化上传操作
    smart.upload() ;            // 上传准备
    String name = smart.getRequest().getParameter("uname") ;
    IPTimeStamp its = new IPTimeStamp("192.168.1.1") ;    // 取得客户端的IP地址
    for(int x=0;x<smart.getFiles().getCount();x++){
        String ext = smart.getFiles().getFile(x).getFileExt() ;    // 扩展名称
        String fileName = its.getIPTimeRand() + "." + ext ;
        smart.getFiles().getFile(x).saveAs(this.getServletContext().getRealPath("/")+"upload"+java.io.File.separator + fileName) ;
    }
    out.print("上传成功");
%>
</body>
</html>

注意:在TOMCAT_HOME/项目目录下建立upload文件夹才能正常运行!

简单上传操作上传后的文件名称是原本的文件名称。可通过工具类重命名。

另附上重命名工具类。

复制代码 代码如下:
package com.zhou.study ;
import java.text.SimpleDateFormat ;
import java.util.Date ;
import java.util.Random ;
public class IPTimeStamp {
    private SimpleDateFormat sdf = null ;
    private String ip = null ;
    public IPTimeStamp(){
    }
    public IPTimeStamp(String ip){
        this.ip = ip ;
    }
    public String getIPTimeRand(){
        StringBuffer buf = new StringBuffer() ;
        if(this.ip != null){
            String s[] = this.ip.split("\\.") ;
            for(int i=0;i<s.length;i++){
                buf.append(this.addZero(s[i],3)) ;
            }
        }
        buf.append(this.getTimeStamp()) ;
        Random r = new Random() ;
        for(int i=0;i<3;i++){
            buf.append(r.nextInt(10)) ;
        }
        return buf.toString() ;
    }
    public String getDate(){
        this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
        return this.sdf.format(new Date()) ;
    }
    public String getTimeStamp(){
        this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") ;
        return this.sdf.format(new Date()) ;
    }
    private String addZero(String str,int len){
        StringBuffer s = new StringBuffer() ;
        s.append(str) ;
        while(s.length() < len){
            s.insert(0,"0") ;
        }
        return s.toString() ;
    }
    public static void main(String args[]){
        System.out.println(new IPTimeStamp().getIPTimeRand()) ;
    }
}

附上使用方法:

复制代码 代码如下:
<html>
<head><title>smartupload上传文件重命名</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head>
<body>
<form action="smartupload_demo03.jsp" method="post" enctype="multipart/form-data">
    姓名<input type="text" name="uname"><br>
    照片<input type="file" name="pic"><br>
    <input type="submit" value="上传">
    <input type="reset" value="重置">
</form>
</body>
</html>

Jsp代码:

smartupload_demo03.jsp

复制代码 代码如下:
<%@ page contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="com.jspsmart.upload.*" %>
<%@ page import="com.zhou.study.*"%>
<html>
<head><title>smartupload</title></head>
<body>
<%
    SmartUpload smart = new SmartUpload() ;
    smart.initialize(pageContext) ;    //初始化上传操作
    smart.upload() ;    // 上传准备
    String name = smart.getRequest().getParameter("uname") ;
    String str = new String(name.getBytes("gbk"), "utf-8");    //传值过程中出现乱码,在此转码
    IPTimeStamp its = new IPTimeStamp("192.168.1.1") ;    // 取得客户端的IP地址
     String ext = smart.getFiles().getFile(0).getFileExt() ;    // 扩展名称
    String fileName = its.getIPTimeRand() + "." + ext ;
    smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/")+"upload"+java.io.File.separator + fileName) ; 
    out.print("上传成功");
%>

<h2>姓名:<%=str%></h2>
<img src="upload/<%=fileName%>">
</body>
</html>

希望本文所述对大家的jsp程序设计有所帮助。

 
标签: java 文件 上传
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • #新闻拍一拍# Oracle 调研如何避免让 Java 开发者投奔 Rust 和 Kotlin | Linux 中国
    #新闻拍一拍# Oracle 调研如何避免让 Java 开发
     导读:• 英特尔对迟迟不被 Linux 主线接受的 SGX Enclave 进行了第 38 次修订 • ARM 支持开源的 Panfrost Gallium3D 驱动本文字数:977,阅读时长大约:1分钟作者:硬核老王Oracle 调研如何避免让 Java 开发者投奔 Rust 和 KotlinOracle 委托分析公司 Omd
    03-08
  • oogle的“ JavaScript杀手” Dart 与JavaScript的比较
    oogle的“ JavaScript杀手” Dart 与JavaScript
    JavaScript通常被称为浏览器脚本语言,但它也已扩展到许多服务器端和移动应用程序开发环境。JS已经存在了将近20年,可以肯定地说它确实是一种成熟且稳定的编程语言。在Facebook发布React和React Native框架之后,JS变得越来越流行。JavaScript具有自己的软件
    03-08
  • sf02_选择排序算法Java Python rust 实现
    Java 实现package common;public class SimpleArithmetic {/** * 选择排序 * 输入整形数组:a[n] 【4、5、3、7】 * 1. 取数组编号为i(i属于[0 , n-2])的数组值 a[i],即第一重循环 * 2. 假定a[i]为数组a[k](k属于[i,n-1])中的最小值a[min],即执行初始化 min =i
    02-09
  • Delphi XE6 通过JavaScript API调用百度地图
    Delphi XE6 通过JavaScript API调用百度地图
    参考昨天的内容,有朋友还是问如何调用百度地图,也是,谁让咱都在国内呢,没办法,你懂的。 首先去申请个Key,然后看一下百度JavaScript的第一个例子:http://developer.baidu.com/map/jsdemo.htm下一步,就是把例子中的代码,移动TWebBrower中。 unit Unit
    02-09
  • JavaScript面向对象轻松入门之抽象(demo by ES5
    抽象的概念  狭义的抽象,也就是代码里的抽象,就是把一些相关联的业务逻辑分离成属性和方法(行为),这些属性和方法就可以构成一个对象。  这种抽象是为了把难以理解的代码归纳成与现实世界关联的概念,比如小狗这样一个对象:属性可以归纳出“毛色”、
    02-09
  • Java与Objective-C的渊源 objective-c和c++的区
    java创始成员Patrick Naughton回忆,通常人们会认为Java是学Modula-3和C+,其实这些都是谣传,而对Java影响比较大的则是Objective-C:单 继承、动态绑定和加载、类对象、纯虚函数、反射、原始类型包装类等。Java的接口直接抄自OC的协议。  Objective-C是扩
    02-09
  • Java项目导出数据为 PDF 文件的操作代码
    Java项目导出数据为 PDF 文件的操作代码
    目录Java项目如何导出数据为 PDF 文件?一、代码结构如下二、代码说明1、添加依赖 pom.xml2、HTML模板文件 audit_order_record.html3、添加字体4、PDF 导出工具类5、导出接口6、打开浏览器测试三、效果图Java项目如何导出数据为 PDF 文件?一个小需求,需要将
  • 盘点Java中延时任务的多种实现方式 java 延时队列怎么实现
    盘点Java中延时任务的多种实现方式 java 延时队
    目录场景描述实现方式一、挂起线程二、ScheduledExecutorService 延迟任务线程池三、DelayQueue(延时队列)四、Redis-为key指定超时时长,并监听失效key五、时间轮六、消息队列-延迟队列场景描述①需要实现一个定时发布系统通告的功能,如何实现? ②支付超时
  • Java Semaphore信号量使用分析讲解
    Java Semaphore信号量使用分析讲解
    目录前言介绍和使用API介绍基本使用原理介绍获取许可acquire()释放许可release()总结前言大家应该都用过synchronized 关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什么好的办法呢? 答案就是JUC提供的信
  • 【Java并发入门】03 互斥锁(上):解决原子性问题
    【Java并发入门】03 互斥锁(上):解决原子性
    原子性问题的源头是线程切换Q:如果禁用 CPU 线程切换是不是就解决这个问题了?A:单核 CPU 可行,但到了多核 CPU 的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问题。所以,解决原子性的关键是「同一时刻只有一个线程处理该变量,也被称
    02-09
点击排行