首先引入2个jar
![](http://images2017.cnblogs.com/blog/1128666/201711/1128666-20171101145630498-2084371020.png) 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 文件上传 下载 总结的更多相关文章

  1. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  2. Java文件上传下载原理

    文件上传下载原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的 文件上传原 ...

  3. java文件上传下载

    文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使 ...

  4. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. java 文件上传下载

    翻新十年前的老项目,文件上传改为调用接口方式,记录一下子~~~ java后台代码: //取配置文件中的上传目录 @Value("${uploadPath}") String pat ...

  6. java文件上传下载解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  7. [Java] 文件上传下载项目(详细注释)

    先上代码,最上方注释是文件名称(运行时要用到) FTServer.java /* FTServer.java */ import java.util.*; import java.io.*; publ ...

  8. java文件上传下载 使用SmartUpload组件实现

    使用SmartUpload组件实现(下载jsmartcom_zh_CN.jar) 2017-11-07 1.在WebRoot创建以下文件夹,css存放样式文件(css文件直接拷贝进去),images存 ...

  9. [java]文件上传下载删除与图片预览

    图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...

随机推荐

  1. java udp通信

    package net.kkxm.kms;  import java.net.DatagramPacket; import java.net.DatagramSocket; import java.n ...

  2. keras输出预测值和真实值

    在使用keras搭建神经网络时,有时需要查看一下预测值和真是值的具体数值,然后可以进行一些其他的操作.这几天查阅了很多资料.好像没办法直接access到训练时的数据.所以我们可以通过回调函数,传入新的 ...

  3. DBUtil内部实现过程解读

    python数据库连接工具DBUtils DBUtils是一个允许在多线程python应用和数据库之间安全及高效连接的python模块套件. 模块 DBUtils套件包含两个模块子集,一个适用于兼容D ...

  4. opengl版本

    OpenGL vendor string: IntelOpenGL renderer string: Intel(R) HD Graphics 630OpenGL version string: 4. ...

  5. 26Flutter 日期 和时间戳/格式化日期库/flutter异步/ 官方自带日期组件showDatePicker、时间组件showTimePicker以及国际化

    /* 一.Flutter日期和时间戳 日期转换成时间戳 var now=newDateTime.now(); print(now.millisecondsSinceEpoch); //单位毫秒,13位 ...

  6. 在Eclipse Android中设置模拟器屏幕大小

    在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. 方法 ...

  7. C#基础知识学习 linq 和拉姆表达式一

    两个方法对比 第二种方法 对比学习 拉姆表达 linq 用法

  8. Mac OS X下把 /etc/sudoers 写错了怎么办?(转载https://blog.csdn.net/robertsong2004/article/details/53725285)

    重要的事情先说一下,首先为了回避这个问题,一定要用 visudo 来改 /etc/sudoers 文件. 问题描述: 1. 用  sudo vi 直接改 /etc/sudoers 并覆盖原文件. 2. ...

  9. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  10. printf特殊用法

    printf("%*.*lf\n", a, b, c); //表示a宽距,保留b位小数 用这种方法可以通过输入控制a和b