文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明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 = ; // 默认的上传文件大小为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,则使用新的设置
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("\\.")[];
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(); // 取出里面的内容
}
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() > ) {
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("\\.")[];
saveFile = new File(saveDir + fileName); // 重新拼凑出新的路径
names.add(fileName); // 保存生成后的文件名称
try {
input = item.getInputStream(); // 取得InputStream
out = new FileOutputStream(saveFile); // 定义输出流保存文件
int temp = ; // 接收每一个字节
while ((temp = input.read()) != -) { // 依次读取内容
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>

java基础篇---文件上传(smartupload组件)的更多相关文章

  1. java基础篇---文件上传(组件)

    转载自:http://www.cnblogs.com/oumyye/p/4234969.html 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本 ...

  2. java基础篇---文件上传(commons-FileUpload组件)

    上一篇讲解了smartupload组件上传,那么这一篇我们讲解commons-FileUpload组件上传 FileUpload是Apache组织(www.apache.org)提供的免费的上传组件, ...

  3. JAVA基础篇—文件上传下载

    /index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  4. JSP文件上传--Smartupload组件

    把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...

  5. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  6. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  7. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  8. java+web+大文件上传下载

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  9. Java开发系列-文件上传

    概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...

随机推荐

  1. macOS SIP 权限设置

    1.macOS SIP 权限设置 对于 macOS 10.11+ 用户,由于系统启用了 SIP(System Integrity Protection), 导致 root 用户也没有权限修改 /usr ...

  2. 增量式pid和位置式PID参数整定过程对比

    //增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...

  3. hadoop1.2.1+zk-3.4.5+hbase-0.94.1集群安装过程详解

    hadoop1.2.1+zk-3.4.5+hbase-0.94.1集群安装过程详解 一,环境: 1,主机规划: 集群中包括3个节点:hadoop01为Master,其余为Salve,节点之间局域网连接 ...

  4. SQL 正则表达式 `(user_log_acct)?+.+`

    SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列: SELECT `(ds|hr)?+.+` FROM test    

  5. [转]python pickle模块

    持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让 ...

  6. JPA的多表复杂查询

    转 JPA的多表复杂查询:详细篇 原文链接: https://mp.weixin.qq.com/s/7J6ANppuiZJccIVN-h0T3Q 2017-11-10 从小爱喝AD钙  最近工作中由于 ...

  7. Maven:浅析依赖(dependency)关系中 scope 的含义(转)

    在 Pom4 中,dependency 元素中引入了 scope 元素,这是一个很重要的属性.在Maven 项目中 Jar 包冲突.类型转换异常的很大原因是由于 scope 元素使用不当造成的. sc ...

  8. windows 自动移动maven jar包到jmeter 文件夹下面

    jmeter 自动移动maven jar包到jmeter 文件夹下面 bat 文件 rem 本文件放在jmeter 脚本maven项目根目录下面,和pom.xml在同一个文件夹下面 rem 预置条件, ...

  9. Elastalert 监控

    1.logstash 做监控的优劣 适合match-then-alert 的方式 logstash-filter-metric logstash-input-http_poller 无状态.进程间数据 ...

  10. jQuery学习笔记(jquery.ui插件)

    官网地址:http://ui.jquery.com/ jQuery UI源自于一jQuery插件-Interface.目前版本是1.10.3,需要jQuery 1.6以上版本支持. jQuery UI ...