首页 > 编程语言 >java实现文件上传和下载

java实现文件上传和下载

时间:2023-12-12 14:22:51浏览次数:29  
标签:文件 java tr 获取 user out 上传 下载 fileItem

本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下

文件的上传

upload:文件上传

客户端通过表单的文件域file  把客户端的文件 上传保存到服务器的硬盘上

页面

首先对上传的表单有以下要求:

  • 必须有文件域:input type=file
  • 表单提交方式:method=post
  • 表单的 enctype=multipart/form-data
<form method="post" action="/user/regist" enctype="multipart/form-data">         <table style="border: chartreuse;solid:2px">             <tr>                 <th>用户名</th>                 <td><input type="text" name="username"></td>             </tr>             <tr>                 <th>密码</th>                 <td><input type="password" name="password"></td>             </tr>             <tr>                 <th>用户头像</th>                 <td><input type="file" name="photo"> </td>             </tr>             <tr>                 <td colspan="2"><input type="submit" value="提交"></td>             </tr>         </table> </form>

Servlet

1)首先要导入以下两个jar包,通过commons-fileupload实现文件上传

 

2)创建一个工厂对象DiskFileItemFactory,在创建一个多部件表单解析器ServletFileUpload,构造方法传入工厂对象

3)解析器解析请求对象,获得一个list集合,其中list集合存储的是一个一个的fileItem对象,一个fileItem对应一个组件,也就是一个<input>

4) 遍历集合用isFormField()方法判断是否为普通组件,然后着重处理文件域组件

5)获取文件名,并用getRealPath方法获取服务器上传文件所在路径,创建新文件夹

6)获取输入流和创建输出流,进行文件的读写

@WebServlet(value = "/user/regist") public class UploadServlet extends HttpServlet {     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //创建一个工厂对象         DiskFileItemFactory factory = new DiskFileItemFactory();         //创建一个多部件解析器对象         ServletFileUpload fileUpload = new ServletFileUpload(factory);         User user = new User();         FileOutputStream out=null;         try {             //用解析器对象解析请求,返回一个FileItem类型的集合             List<FileItem> list = fileUpload.parseRequest(req);             for (FileItem fileItem : list) {                 /**                  * fileItem.getFieldName());:::获取组件的name值                  * fileItem.getName());::::获取文件域的文件名                  * fileItem.getSize());::::获取数据的字节个数                  * fileItem.getString());::::获取数据的字符串                  * fileItem.isFormField());:::判断是否为普通组件                  */                 //判断部件是否为普通组件                 if (fileItem.isFormField()) {//普通组件                     //获取组件名字也就是name的值                     String fieldName = fileItem.getFieldName();                     //获取组件的值也就是value的值                     String value = fileItem.getString("utf-8");                     if ("username".equals(fieldName)) { //设置实体类的属性                         user.setUsername(value);                     else if ("password".equals(fieldName)) {                         user.setPassword(value);                     }                 else {// 文件域                     //获取文件名                     String fielName = fileItem.getName();                     //输入流来读数据                     InputStream in = fileItem.getInputStream();                     //设置文件写出的路径,并用随机码来保证图片可以重复                     String path=req.getServletContext().getRealPath("/imgs/"+ UUID.randomUUID()+fielName);                     System.out.println("文件路径为:"+path);                     File file = new File(path);                      out = new FileOutputStream(file);                      //利用commons-io-1.4.jar的IOUtils的copy方法直接实现文件的复制                     IOUtils.copy(in,out);                     user.setPhoto(file.getName());                 }             }         catch (Exception e) {             e.printStackTrace();         }finally {             if(out!=null){                 out.close();             }         }         req.getSession().setAttribute("user",user);         req.getRequestDispatcher("/sucess.jsp").forward(req,resp);     }    }

文件的下载

页面

只需一个超链接,传需要下载的文件名,或者直接输入路径在浏览器

例: <a  href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>

Servlet

1)接收参数,获取文件名

2)获取imgs的路径,也就是存储文件的文件夹的路径,然后创建文件,传入该路径和文件名

3)创建输入流读取文件

4)设置响应头,首先根据文件名字获取文件的大类型,设置响应头Content-Type指定响应的类型;设置响应头Content-Disposition,指定文件以附件形式保存到本地磁盘

5)用响应获取输出流,读出文件到客户端

@WebServlet("/user/download") public class DownloadServlet extends HttpServlet {     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         request.setCharacterEncoding("UTF-8");         //获取要下载的文件名         String fileName = request.getParameter("fileName");         System.out.println(fileName);         //获取服务器中存储图片的文件夹的路径         String path1 = request.getServletContext().getRealPath("/imgs");         String path=path1+"/"+fileName;         File file = new File(path);         //创建输入流读文件         FileInputStream in = new FileInputStream(file);         //通过文件名字获取文件的大类型         String type = request.getServletContext().getMimeType(fileName);         //设置响应头ContentType指定响应内容的类型         response.setHeader("Content-type",type);         //设置响应头Content-Disposition 指定以附件形式保存响应的信息         response.setHeader("Content-Disposition","attachment;filename="+(URLEncoder.encode(fileName, "utf-8")));         ServletOutputStream out = response.getOutputStream();         //实现文件的读写         IOUtils.copy(in,out);         if(in!=null){         in.close();         }     } }

以上就是本文的全部内容,希望对大家的学习有所帮助

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/12/java%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd/

欢迎入群一起讨论

 

 

标签:文件,java,tr,获取,user,out,上传,下载,fileItem
From: https://www.cnblogs.com/songsu/p/17896691.html

相关文章

  • blob 下载文件type是否必须设置
    又遇到了一件鬼打墙的事,欲哭无泪。1几天前,有个bug:blob文件下载,如果下载非txt文件,比如图片、xlsx,下载后的文件无法正确显示。//下载文件asyncdownload(row,prop){constres=awaitresourceDownload(row[prop.field+"fileId"]);//res为blob......
  • java基本类型包装类
    一、概述  二、Integer包装类 三、int和String的转换 1、方式一 2、方式二 3、方式三 4、方式四 四、自动装箱和拆箱 五、日期格式化 示例: ......
  • 07 java运行时数据区域
    包含堆、方法区、程序计数器、本地方法栈、虚拟机栈。这就是运行数据区的几个部分。其中堆和方法区是线程共有的,其它数据区域是线程私有的。堆中存储对象数据。方法区中储存类信息、常量及静态变量等信息。方法栈中的栈帧和线程的寿命是一致的,储存方法执行时的相关常量,比如局部变量......
  • 高并发情况下的漏桶算法(javascript版)
    classLeakyBucket{//高并发情况下的漏桶算法 constructor(capacity,leakRate){//创建一个容量为capacity,每秒漏水量为leakRate的漏桶 this.capacity=capacity; this.leakRate=leakRate; this.water=0; this.lastLeakTime=Date.now(); ......
  • Java-SpringBean的生命周期
    Java-SpringBean的生命周期简单版实例化(Instantiation):当Spring容器启动时,它会检查配置文件或注解,然后实例化所有在配置中声明的Bean。这是通过构造函数或工厂方法进行的。属性设置(PopulationofProperties):容器实例化Bean后,会通过依赖注入或者setter方法将配置的......
  • Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)
    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想开发一个很实用的工具类,用......
  • Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)
    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想开发一个很实用的工具类,用......
  • Java数组
    免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动1.数组数组可用存放多个同一类型的数据,数组也是一种数据类型,是引用类型1.1一维数组1.1.1使用方式1-动态初始化语法:数据类型数......
  • JavaWeb——文件上传与下载
    一、文件上传简介1、文件上传的步骤(1)要有一个form表单,请求方式为post请求(因为上传的文件一般都超出长度限制)。(2)form标签的encType属性值必须为multipart/form-data。表示提交的数据,以多段的形式进行拼接,然后以二进制流的形式发送给服务器。多段:一个表单项代表一个数据......
  • JAVA 短剧小程序源码功能说明?如何运营?需要什么资质?
    JAVA短剧小程序源码的功能主要包含以下几个方面:1.用户登录注册:用户可以通过输入用户名和密码进行登录,或者通过注册账号来使用小程序。2.短剧浏览:用户可以在小程序中浏览各种类型的短剧,如喜剧、爱情剧、科幻剧等。同时,用户可以查看短剧的简介、演员信息以及播放量等。3.短剧搜......