java 文件上传 下载 总结
首先引入2个jar

package uploaddownload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Savepoint;
import java.util.List;
import java.util.UUID;
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.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
*
* @ClassName UploadBoost
* @Description TODO(这里用一句话描述这个类的作用)
* @Author pengzh humi
* @Date 2017年11月1日 上午10:38:36
*/
public class UploadBoost extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
System.out.println("UploadBoost init ...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("DO Get method ...");
String saveFile = this.getServletContext().getRealPath("/WEB-INF/upload");
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if(!tempFile.exists()){
tempFile.mkdir();
}
//消息提示
String message="";
InputStream in =null;
FileOutputStream out = null;
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024*5);//5k缓存
factory.setRepository(tempFile);//临时保存路径
ServletFileUpload upload = new ServletFileUpload(factory);//创建文件解析器
upload.setProgressListener(new ProgressListener() {//上传进度
public void update(long finished, long total, int rate) {
// TODO Auto-generated method stub
System.out.println("文件上传进度"+finished+"/"+total+"|"+Math.floor((double)(finished*100/total))+"% rate="+rate);
}
});
upload.setHeaderEncoding("utf-8");//解决文件名乱码
if(!ServletFileUpload.isMultipartContent(req)){
message = "非媒体文件上传";
return;
}
upload.setFileSizeMax(1024*1024*5);//设置单个文件上传最大为5M
upload.setSizeMax(1024*1024*10);//设置上传文件总量最大值为5M
List<FileItem> fileList = upload.parseRequest(req);
for (FileItem item : fileList) {
if(item.isFormField()){
System.out.println("表单数据:name="+item.getFieldName()+" value="+item.getString("utf-8"));
}else{
String fileName =item.getName();
if(fileName==null||fileName.trim().equals("")){
continue;
}
System.out.println("上传的文件名:"+fileName);
fileName = getFileName(fileName.substring(fileName.lastIndexOf("\\")+1));//得到唯一文件名
String fileExtName=fileName.substring(fileName.lastIndexOf(".")+1);//得到后缀名
String dir = getPaht(fileName, saveFile);
System.out.println("唯一文件名:"+fileName+"\n文件扩展名"+fileExtName+"\n保存路径名:"+saveFile+"\n哈希路径:"+dir);
in = item.getInputStream();
out = new FileOutputStream(dir+"\\"+fileName);
byte[] buff= new byte[1024];//字节流 1k缓冲
int length=0;//文件标记位
while((length=in.read(buff, 0, length))>0){
out.write(buff, 0, length);
}
message="文件上传成功";
}
}
}catch (FileUploadBase.FileSizeLimitExceededException e) {
System.out.println("上传失败 "+e.getMessage());
message="上传失败 "+e.getMessage();
}catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("上传失败 "+e.getMessage());
message="上传失败 "+e.getMessage();
}catch (Exception e) {
System.out.println("上传失败 "+e.getMessage());
message="上传失败 "+e.getMessage();
}finally{
//关闭流 并置空 让JVM去回收
out.close();out=null;
in.close();in=null;
//消息提示
System.out.println("message="+message);
req.setAttribute("message", message);
req.getRequestDispatcher("/message.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("Do Post method ...");
doGet(req, resp);
}
/**
*
* @param name
* @return 唯一文件名
*/
public String getFileName(String name){
return UUID.randomUUID().toString()+"_"+name;
}
/**
*
* @param name
* @param path
* @return 得到哈希路径
*/
public String getPaht(String name,String path){
int hashcode = name.hashCode();
int dir1 = hashcode&0xf;
int dir2 = dir1>>4;
// System.out.println("hashcode="+hashcode+"\ndir1="+dir1+"\ndir2="+dir2);
String dir = path +"\\"+dir1+"\\"+dir2;
File file = new File(dir);
if(!file.exists()){
file.mkdirs();
// System.out.println("file==="+file+" "+file.toURI());
}
return dir;
}
}
===============================================================
package uploaddownload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @ClassName DownLoadServlet
* @Description 文件下载
* @Author pengzh humi
* @Date 2017年11月2日 下午8:10:20
*/
public class DownLoadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String realPaht= this.getServletContext().getRealPath("/WEB-INF/upload");
String fileName =req.getParameter("filename");
String filePath =findFileBySavePath(fileName, realPaht);
File file = new File(filePath+"\\"+fileName);//得到需要下载的文件
System.out.println("文件下载 DownLoadServlet 路径"+filePath+"\\"+fileName);
if(!file.exists()){
req.setAttribute("message", "你要下载的文件已删除");
req.getRequestDispatcher("/message.jsp").forward(req, resp);
return;
}
fileName = fileName.substring(fileName.lastIndexOf('_')+1);
//设置响应头,控制浏览器下载该文件
resp.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
OutputStream out=resp.getOutputStream();
FileInputStream in = new FileInputStream(file);
int len =0;
byte[] buff= new byte[1024];
System.out.println("将下载 DownLoadServlet: "+fileName);
while((len=in.read(buff))>0){
out.write(buff, 0, len);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
/**
*
* @param fileName 文件名
* @param savePath 下载后保存的路径
* @return
*/
public String findFileBySavePath(String fileName,String savePath){
int hashCode = fileName.hashCode();
int dir1 = hashCode&0xf;
int dir2 = dir1>>4;
String dir = savePath+"\\"+dir1+"\\"+dir2;
System.out.println("保存目录处理:dir1="+dir1+" dir2="+dir2+" dir="+dir);
File file = new File(dir);
if(!file.exists()){
file.mkdirs();
}
return dir;
}
}
java 文件上传 下载 总结的更多相关文章
- 2013第38周日Java文件上传下载收集思考
2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...
- Java文件上传下载原理
文件上传下载原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的 文件上传原 ...
- java文件上传下载
文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使 ...
- java文件上传下载组件
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- java 文件上传下载
翻新十年前的老项目,文件上传改为调用接口方式,记录一下子~~~ java后台代码: //取配置文件中的上传目录 @Value("${uploadPath}") String pat ...
- java文件上传下载解决方案
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- [Java] 文件上传下载项目(详细注释)
先上代码,最上方注释是文件名称(运行时要用到) FTServer.java /* FTServer.java */ import java.util.*; import java.io.*; publ ...
- java文件上传下载 使用SmartUpload组件实现
使用SmartUpload组件实现(下载jsmartcom_zh_CN.jar) 2017-11-07 1.在WebRoot创建以下文件夹,css存放样式文件(css文件直接拷贝进去),images存 ...
- [java]文件上传下载删除与图片预览
图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...
随机推荐
- maven install的时候把源码一起放到仓库
在pom.xml中加入插件 <build> <plugins> <!-- Source attach plugin --> < ...
- wordpress插件开发流程梳理-二
开发插件的最佳实践 避免命名冲突 当您的插件对变量,函数或类使用相同的名称作为另一个插件时,会发生命名冲突. 幸运的是,您可以使用以下方法避免命名冲突. 程序性 默认情况下,所有变量,函数和类都在全局 ...
- 不同三维引擎渲染IFC数据效果对比
- MySQL复制表结构
示例SQL: create table testdb.test_table_back like testdb.test_table
- 树形DP入门学习
这里是学习韦神的6道入门树形dp进行入门,本来应放在day12&&13里,但感觉这个应该单独放出来好点. 这里大部分题目都是参考的韦神的思想. A - Anniversary part ...
- Tinymce在ASP.NET中的使用方法
现在做网页,用FCKEditor用得比较多,它的实现原理是在要加入FCKEditor的地方加入一个iframe,并将其src指向FCKeditor/editor/fckeditor.html?Inst ...
- 【ARTS】01_33_左耳听风-201900624~201900630
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- iOS-UITabbar自定义
[self createCustomTabBar]; -(void)createCustomTabBar{ //创建一个UIImageView,作为底图 UIImageView *bgVi ...
- Azure AADSTS7000215 其中一种问题的解决
众所周知,Azure提供了整套的rest api,经过认证和授权,完美阐述了”我是谁,我能做什么“.对资源层的操作,我们很多时候是使用Powershell或者Azure CLI或者各个语言的SDK, ...
- 金仓Kingbase数据库网页数据维护分析工具
金仓Kingbase是优秀的国产数据库产品,在能源,政务,国防等领域广泛使用, 现在TreeSoft数据库管理系统已支持Kingbase了,直接在浏览器中就可以操作查看Kingbase数据了,十分方便 ...