下载文件

public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取下载文件的路径下载文件的路径:D:\soft\apache-tomcat-9.0.41\webapps\ROOT\timg.jpg//this.getServletContext().getRealPath("/timg.jpg")String realPath = "E:\\springboot-kuoyhen\\fileuploadtest\\target\\classes\\大磊.jpg";System.out.println("下载文件的路径:"+realPath);//2.下载的文件的名是啥?String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//3.设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码resp.setHeader("Content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));//4.获取下载文件的输入流FileInputStream in = new FileInputStream(realPath);//5.创建缓冲区int len=0;byte[] buffer=new byte[1024];//6.获取OutputStream对象ServletOutputStream out = resp.getOutputStream();//7.将fileOutputStream流写入到buffer缓冲区使用OutputStream将缓冲区的数据输出到客户端while ((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close();}

https://mvnrepository.com/artifact/commons-io/commons-io/2.7
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.3.3

前端页面代码

<%--${pageContext.request.contextPath}获取服务器路径--%><form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">上传用户:<input type="text" name="username"><br/><p><input type="file" name="file1"/></p><p><input type="file" name="file1"/></p><p><input type="submit"> | <input  type="reset"></p></form>

后台页面代码

package com.donghang.servlet;import org.apache.commons.fileupload.FileItem;
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 javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//判断上传的文件是普通表单还是带文件的表单if (!ServletFileUpload.isMultipartContent(req)) {return;//终止方法运行,说明这是一个普通的表单,直接返回}//创建上传文件的保存路径,建议在WEB-INF路径下,安全,用户无法直接访问上传的文件;String uploadPath=this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);if(!uploadFile.exists()){uploadFile.mkdir();//创建这个目录}//缓存//临时目录,假如文件超过了预期的大小,我们就把他放到一个临时文件中,过几天自动删除,或者提醒用户转存为永久String tmpPath=this.getServletContext().getRealPath("/WEB-INF/tmp");File file = new File(tmpPath);if(!file.exists()){file.mkdir();//创建这个临时目录}//处理上传的文件,一般都需要通过流来获取,我们可以使用request.getInputStream(),原生态的文件上传流获取,十分麻烦//但是我们都建议使用Apache的文件上传组件来实现,common-fileupload,它需要依赖于common-io组件try {//1.创建DiskFileItemFactory对象,处理文件上传路径或者大小限制;DiskFileItemFactory factory = getDiskFileItemFactory(file);//2.获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//3.处理上传的文件String msg = uploadParseRequest(upload, req, uploadPath);//servlet请求转发消息req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req,resp);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public DiskFileItemFactory getDiskFileItemFactory(File file){DiskFileItemFactory factory = new DiskFileItemFactory();//通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中;factory.setSizeThreshold(1024*1024);//缓冲区大小为1mfactory.setRepository(file);//临时目录的保存目录,需要一个Filereturn factory;}public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){ServletFileUpload upload = new ServletFileUpload(factory);//监听文件上传进度upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("总大小:"+pContentLength+"已上传:"+pBytesRead);}});//处理乱码问题upload.setHeaderEncoding("UTF-8");//设置单个文件的最大值upload.setFileSizeMax(1024*1024*10);//设置总共能够上传文件的大小upload.setSizeMax(1024*1024*10);return upload;}public String uploadParseRequest(ServletFileUpload upload,HttpServletRequest req,String uploadPath) throws Exception {String msg="";//把前端请求解析,封装成一个FileItem对象,需要从ServletFileUpload对象中获取List<FileItem> fileItems = upload.parseRequest(req);//fileItem 每一个表单对象for (FileItem fileItem : fileItems) {//判断上传的文件是普通表单还是带文件的表彰if(fileItem.isFormField()){//getFieldName指的是前端表单控件的name;String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");//处理乱码System.out.println(name+":"+value);}else{//文件//==============处理文件====================//String uploadFileName = fileItem.getName();//可能存在文件名不合法的情况if(uploadFileName.trim().equals("")||uploadFileName==null){continue;}//获得上传的文件名 /images/girl/paojie.pngString fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//获得文件的后缀名String fileExtName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);/*如果文件后缀名fileExtName 不是我们所需要的就直接return,不处理,告诉用户文件类型不对、*///可以使用UUID(唯一识别的通用码),保证文件名唯一;//UUID.randomUUID(),随机生一个唯一识别的通用码;String uuidPath= UUID.randomUUID().toString();//======================处理文件完毕===================================////网络传输中的东西,都需要序列化//POJO,实体类,如果想要在多个电脑上运行,传输====> 需要把对象都序列化了//implements Serializable:标记接口,JVM//==============存放地址====================////存到哪?uploadPath//文件真实存在的路径 realPathString realPath=uploadPath+"/"+uuidPath;//给每个文件创建一个对应的文件夹File realPathFile = new File(realPath);if(!realPathFile.exists()){realPathFile.mkdir();}//==============文件传输====================////获得文件上传的流InputStream inputStream = fileItem.getInputStream();//创建一个文件输出流//realPath=真实的文件夹//差了一个文件;加上输出文件的名字+"/"+uuidFileNameFileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);//创建一个缓冲区byte[] buffer=new byte[1024*1024];//判断是否读取完毕int len=0;//如果大于0说明还存在数据while((len=inputStream.read(buffer))>0){fos.write(buffer,0,len);}//关闭流fos.close();inputStream.close();msg="文件上传成功!";fileItem.delete();//上传成功,清除临时文件//=====================文件传输完毕===========================//}}return msg;}
}

javaWeb Response下载和上传文件相关推荐

  1. 以命令方式从ftp服务器上下载和上传文件

    ** 以命令方式从ftp服务器上下载和上传文件 wang ** 1."开始"→"运行",输入"cmd",打开命令提示符: 2.在命令提示符内 ...

  2. 使用spring-cloud-FeignClient下载和上传文件

    工作上,遇到一个问题.我需要用@FeignClient远程调用文件服务,下载一个doc文件,把它转换成ceb或pdf文件,在上传到文件系统.其实我就是在开发文件转换服务.那么,我们该怎么用FeignC ...

  3. 通过CMD命令连接ftp下载和上传文件

    通过CMD命令连接ftp下载文件 win+r输入cmd打开DOS命令 2.连接ftp 格式:ftp ip然后回车根据提示输入用户名和密码 3.登陆成功后.输入"cd"命令.会显示& ...

  4. 图解使用CURL下载和上传文件

    参阅 http://blog.csdn.net/wulong710/article/details/53127606 下面图解操作过程: 下载单个文件,默认将输出打印到标准输出中(STDOUT)中 通 ...

  5. MobaXterm下载上传文件和上传文件夹

    MobaXterm 怎么样上传和下载文件? 左侧栏:下载和上传文件 MobaXterm 怎么样上传文件夹? 选中文件夹拖拽即可

  6. java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码

    Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...

  7. 【TFTP客户端--实现下载文件和上传文件】

    TFTP客户端--实现下载文件和上传文件 TFTP协议 文件下载 文件上传 main TFTP协议 TFTP是一个传输文件的简单协议,它其于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其 ...

  8. 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性...

    原文:重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 [源码下载] 重新想象 Wind ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

    写在前面 之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战] ...

最新文章

  1. Docker 简介与安装
  2. 如何确认mongodb数据插入是否成功_go连接mongodb
  3. 使用 Castal DynamicProxy 简化 Silverlight 数据绑定
  4. 【VS开发】使用WinPcap编程(1)——获取网络设备信息
  5. Laravel 安装mysql、表增加模拟数据、生成控制器
  6. jquery ajax实例 php,jquery中各个ajax实例操作
  7. 【面试】2019工商银行软件开发中心(上海)笔面试记录
  8. DTM动态主题模型实战案例
  9. webstorm最新版激活破解
  10. html网页制作提交注册信息,利用HTML表单标签编写一个注册页面
  11. 3-24 浅谈多元正态分布的基本性质
  12. 魅蓝note2手机计算机打开教程,魅族 魅蓝note2 开启USB调试模式
  13. win10系统steam连接不上服务器,win10系统steam无法连接到更新服务器的解决方法
  14. 2021年程序人生的随想总结
  15. Artemis客户端安装
  16. Carsim2016和Matlab 2018 联合仿真
  17. mysql的存储模型_一种BIM模型数据的数据库存储格式的制作方法
  18. Matlab+Robotic toolbox (各版本免费获取,及安装步骤)
  19. 类脑计算:让人工智能走得更远
  20. python儿童编程培训班-儿童Python编程辅导班学费

热门文章

  1. 夕阳西下,行业内卷,土木转行Python的几个方向?
  2. 最新系统漏洞--Metinfo SQL注入漏洞
  3. 双十一好物分享,最值得入手的双十一好物推荐
  4. Java自动化测试(app自动化环境搭建 31)
  5. IPV6地址格式解析
  6. Qt中点击pushButton按钮实现切换父子界面
  7. python写炒股软件_用Python炒股,你不可以我能行!网友:略牛
  8. Speeding up Graph Edit Distance Computation with a Bipartite Heuristic 使用二部图匹配寻找顶点的最佳映射
  9. Google 的开源技术protobuf 简介与例子 .
  10. Python numpy astype 强制类型转换