热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

JAVA使用commos-fileupload实现文件上传与下载实例解析

这篇文章主要介绍了JAVA使用commos-fileupload实现文件上传与下载的相关资料,需要的朋友可以参考下

首先给大家介绍一文件的上传

实体类

import java.sql.Timestamp; 
/** 
* 
* @Decription 文件上传实体类 
* 
*/ 
public class Upfile { 
private String id;// ID主键 使用uuid随机生成 
private String uuidname; // UUID名称 
private String filename;//文件名称 
private String savepath; // 保存路径 
private Timestamp uploadtime; // 上传时间 
private String description;// 文件描述 
private String username; // 用户名 
public Upfile() { 
super(); 
} 
public Upfile(String id, String uuidname, String filename, String savepath, 
Timestamp uploadtime, String description, String username) { 
super(); 
this.id = id; 
this.uuidname = uuidname; 
this.filename = filename; 
this.savepath = savepath; 
this.uploadtime = uploadtime; 
this.description = description; 
this.username = username; 
} 
public String getDescription() { 
return description; 
} 
public String getFilename() { 
return filename; 
} 
public String getId() { 
return id; 
} 
public String getSavepath() { 
return savepath; 
} 
public Timestamp getUploadtime() { 
return uploadtime; 
} 
public String getUsername() { 
return username; 
} 
public String getUuidname() { 
return uuidname; 
} 
public void setDescription(String description) { 
this.description = description; 
} 
public void setFilename(String filename) { 
this.filename = filename; 
} 
public void setId(String id) { 
this.id = id; 
} 
public void setSavepath(String savepath) { 
this.savepath = savepath; 
} 
public void setUploadtime(Timestamp uploadtime) { 
this.uploadtime = uploadtime; 
} 
public void setUsername(String username) { 
this.username = username; 
} 
public void setUuidname(String uuidname) { 
this.uuidname = uuidname; 
} 
} 

页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
 
 
 
 
 
 
 
 
 
 
 
 

文件上传

上传用户名:
上传文件:
描述:
${msg }
返回主页

Servlet

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; 
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import com.itheima.domain.Upfile; 
import com.itheima.exception.MyException; 
import com.itheima.service.UpfileService; 
import com.itheima.service.impl.UpfileServiceImpl; 
import com.itheima.untils.WebUntil; 
public class UploadFileServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
//判断表单是不是多个部分组成的 
if(!ServletFileUpload.isMultipartContent(request)){ 
request.setAttribute("msg", "表单个设置错误,请检查enctype属性是是否设置正确"); 
request.getRequestDispatcher("/upload.jsp").forward(request, response); 
return ; 
} 
//是多部分组成的就获取并遍历返回一个文件上传对象,包含上传的所有信息 
try { 
Upfile upfile=WebUntil.upload(request); 
UpfileService upfileService=new UpfileServiceImpl(); 
boolean flag=upfileService.add(upfile); 
if(flag){ 
request.setAttribute("msg", "上传成功"); 
request.getRequestDispatcher("/upload.jsp").forward(request, response); 
return ; 
}else{ 
request.setAttribute("msg", "上传失败,请重试"); 
request.getRequestDispatcher("/upload.jsp").forward(request, response); 
return ; 
} 
}catch (FileSizeLimitExceededException e) { 
e.printStackTrace(); 
request.setAttribute("msg", "单个文件大小 ,超过最大限制"); 
request.getRequestDispatcher("/upload.jsp").forward(request, response); 
return ; 
} catch (SizeLimitExceededException e) { 
e.printStackTrace(); 
request.setAttribute("msg", "总文件大小 ,超过最大限制"); 
request.getRequestDispatcher("/upload.jsp").forward(request, response); 
return ; 
} 
} 
}

工具类

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
import javax.servlet.http.HttpServletRequest; 
import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadBase; 
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; 
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.ProgressListener; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import com.itheima.domain.Upfile; 
import com.itheima.exception.MyException; 
/** 
* 文件上传工具类 
* @Decription TODO 
* 
*/ 
public class WebUntil { 
/** 
* 文件上传的方法 
* @param request 请求参数传入 
* @return 返回一个Upfile对象 
* @throws FileSizeLimitExceededException 
* @throws SizeLimitExceededException 
* @throws IOException 
*/ 
public static Upfile upload(HttpServletRequest request) throws FileSizeLimitExceededException, SizeLimitExceededException { 
Upfile upfile=new Upfile(); 
ArrayList fileList=initList(); 
try { 
//获取磁盘文件对象工厂 
DiskFileItemFactory factory=new DiskFileItemFactory(); 
String tmp=request.getSession().getServletContext().getRealPath("/tmp"); 
System.out.println(tmp); 
//初始化工厂 
setFactory(factory,tmp); 
//获取文件上传解析器 
ServletFileUpload upload=new ServletFileUpload(factory); 
//初始化解析器 
setUpload(upload); 
//获取文件列表集合 
List list = upload.parseRequest(request); 
//遍历 
for (FileItem items : list) { 
//判断 是不是普通表单个对象 
if(items.isFormField()){ 
//获取上传表单的name 
String fieldName=items.getFieldName(); 
//value 
String fieldValue=items.getString("UTF-8"); 
//判断 
if("username".equals(fieldName)){ 
//设置 
upfile.setUsername(fieldValue); 
}else if("description".equals(fieldName)){ 
//设置属性 
upfile.setDescription(fieldValue); 
} 
}else{ 
//是文件就准备上传 
//获取文件名 
String filename=items.getName(); 
//处理因为浏览器不同而导致的 获得 的 文件名的 差异 
int index=filename.lastIndexOf("\\"); 
if(index!=-1){ 
filename=filename.substring(index+1); 
} 
//生成随机的文件名 
String uuidname=generateFilename(filename); 
//获取上传的文件路径 
String savepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload"); 
//获取请求对象中的输入流 
InputStream in = items.getInputStream(); 
//将文件打散存放在不同的路径,求出路径 
savepath=generateRandomDir(savepath,uuidname); 
//复制文件 
uploadFile(in,savepath,uuidname); 
String id=UUID.randomUUID().toString(); 
upfile.setId(id); 
upfile.setSavepath(savepath); 
upfile.setUuidname(uuidname); 
upfile.setFilename(filename); 
//清除缓存 
items.delete(); 
} 
} 
}catch ( FileUploadBase.FileSizeLimitExceededException e) { 
//抛出出异常 
throw e; 
} catch (FileUploadBase.SizeLimitExceededException e) { 
//抛出出异常 
throw e; 
}catch (FileUploadException e) { 
e.printStackTrace(); 
} catch (UnsupportedEncodingException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return upfile; 
} 
/** 
* 初始化文件列表 
* @return 
*/ 
private static ArrayList initList() { 
ArrayList list=new ArrayList(); 
list.add(".jpg"); 
list.add(".rar"); 
list.add(".txt"); 
list.add(".png"); 
return list; 
} 
/** 
* 复制文件 
* @param in items中的输入流 
* @param savepath 保存路径 
* @param uuidname 文件名 
*/ 
private static void uploadFile(InputStream in, String savepath, 
String uuidname) { 
//获取文件 
File file=new File(savepath, uuidname); 
OutputStream out = null; 
try { 
int len=0; 
byte [] buf=new byte[1024]; 
//获取输出流 
out = new FileOutputStream(file); 
while((len=in.read(buf))!=-1){ 
out.write(buf, 0, len); 
} 
} catch (FileNotFoundException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
}finally{ 
try { 
in.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
try { 
out.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
} 
/** 
* 生成随机的存放路径 
* @param savepath 保存路径 
* @param uuidname 生成的uuid名称 
* @return 
* 使用hashcode完成 
*/ 
private static String generateRandomDir(String savepath, String uuidname) { 
//转化为hashcode 
System.out.println("上传路径"+savepath); 
System.out.println("UUIDNAME"+uuidname); 
int hashcode=uuidname.hashCode(); 
//容器 
StringBuilder sb=new StringBuilder(); 
while(hashcode>0){ 
//与上15 
int tmp=hashcode&0xf; 
sb.append("/"); 
sb.append(tmp+""); 
hashcode=hashcode>>4; 
} 
//拼接新的路径 
String path=savepath+sb.toString(); 
System.out.println("path"+path); 
File file=new File(path); 
//判断路径存不存在 
if(!file.exists()){ 
//不存在就创建 
file.mkdirs(); 
} 
//返回保存路径 
return path; 
} 
/** 
* 生成新的文件名 
* @param uuidname 随机的ID名字 
* @param filename 原来的名 
* @return 
*/ 
private static String generateFilename( String filename) { 
String uuidname=UUID.randomUUID().toString(); 
return uuidname.replace("-", "").toString()+"_"+filename; 
} 
/** 
* 初始化解析器 
* @param upload 
*/ 
private static void setUpload(ServletFileUpload upload) { 
// 设置 字符编码 
upload.setHeaderEncoding("utf-8"); 
//设置文件大小 
upload.setFileSizeMax(1024*1024*20); 
//设置总文件大小 
upload.setSizeMax(1024*1024*50); 
//设置进度监听器 
upload.setProgressListener(new ProgressListener() { 
public void update(long pBytesRead, long pContentLength, int pItems) { 
System.out.println("已经读取: "+pBytesRead+",总共有: "+pContentLength+", 第"+pItems+"个"); 
} 
}); 
} 
/** 
* 工厂初始化方法 
* @param factory 
* @param tmp 缓冲目录 
*/ 
private static void setFactory(DiskFileItemFactory factory, String tmp) { 
/// 配置初始化值缓冲区 
factory.setSizeThreshold(1024*1024); 
File file=new File(tmp); 
//设置缓冲目录 
factory.setRepository(file); 
} 
}

二文件下载

Servlet

public class DownupfileServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
//获取ID 
String id=request.getParameter("id"); 
//业务层的接口 
UpfileService upfileService=new UpfileServiceImpl(); 
//根据ID查找这个对象 
Upfile upfile=upfileService.findUpfileById(id); 
if(upfile==null){ 
return; 
} 
//获取文件的真实名称 
String filename=upfile.getFilename(); 
//如果文件名中有中文,需要转码,不然就下载时没有文件名 
filename=URLEncoder.encode(filename, "utf-8"); 
//更改过的名称 
String uuidname=upfile.getUuidname(); 
//保存路径 
String savepath=upfile.getSavepath(); 
File file=new File(savepath,uuidname); 
//判断文件 是否存在 
if(!file.exists()){ 
request.setAttribute("msg", "下载 的文件过期了"); 
request.getRequestDispatcher("/index").forward(request, response); 
return; 
} 
//设置文件下载响应头信息 
response.setHeader("Content-disposition", "attachement;filename="+filename); 
//使用IO流输出 
InputStream in = new FileInputStream(file); 
ServletOutputStream out = response.getOutputStream(); 
int len=0; 
byte [] buf=new byte[1024]; 
while((len=in.read(buf))!=-1){ 
out.write(buf, 0, len); 
} 
in.close(); 
} 
}

数据库

create database upload_download_exercise; 
use upload_download_exercise; 
create table upfiles( 
id varchar(100), //使用UUID生成 
uuidname varchar(255),//uuid加上原来的文件名 
filename varchar(100),//真实文件名 
savepath varchar(255),//保存路径 
uploadtime timestamp,//上传时间 
description varchar(255),//描述 
username varchar(10) 上传人 
); 

以上所述是小编给大家分享的JAVA使用commos-fileupload实现文件上传与下载的相关内容,希望对大家有所帮助。


推荐阅读
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 如何高效地安装并配置 PostgreSQL 数据库系统?本文将详细介绍从下载到安装、配置环境变量、初始化数据库、以及优化性能的全过程,帮助读者快速掌握 PostgreSQL 的核心操作与最佳实践。文章还涵盖了常见问题的解决方案,确保用户在部署过程中能够顺利解决遇到的各种挑战。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 深入解析InnoDB中的多版本并发控制机制
    多版本并发控制(MVCC)是InnoDB存储引擎中的一项关键技术,通过维护数据在不同时间点的多个版本,确保了事务的隔离性和一致性。每个读取操作都能获得一个与事务启动时一致的数据视图,从而提高了并发性能并减少了锁竞争。此外,MVCC还支持多种隔离级别,如可重复读和读已提交,进一步增强了系统的灵活性和可靠性。 ... [详细]
  • 如何高效利用Hackbar插件提升网页调试效率
    通过合理利用Hackbar插件,可以显著提升网页调试的效率。本文介绍了如何获取并使用未包含收费功能的2.1.3版本,以确保在不升级到最新2.2.2版本的情况下,依然能够高效进行网页调试。此外,文章还提供了详细的使用技巧和常见问题解决方案,帮助开发者更好地掌握这一工具。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • TCP三次握手过程详解与图示解析
    本文详细解析了TCP三次握手的过程,并通过图示清晰展示了各个状态的变化。同时,文章还介绍了四次挥手的图解,解释了在TIME_WAIT状态中,客户端最后一次发送的ACK包的作用和重要性。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • 如何在Mac上构建高效的本地服务器环境
    在Mac上构建高效的本地服务器环境,首先需要了解基本步骤:1. 配置目录基础;2. 启动Apache服务;3. 添加自定义文档至本地服务器;4. 查看自定义效果。此外,还可以通过手机或其他电脑访问本机服务器,以确保跨设备的兼容性和调试效果。Mac系统自带的Apache服务为本地开发提供了便捷的工具,本文将详细介绍每个步骤的具体操作方法。 ... [详细]
author-avatar
平平您好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有