java实现文件上传和下载

 更新时间:2021年10月20日 09:11:14   作者:一只Java小白1111  
这篇文章主要为大家详细介绍了java实现文件上传和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java安全之CommonsCollections4详解

    java安全之CommonsCollections4详解

    这篇文章主要介绍了java安全之CommonsCollections4详解
    2022-08-08
  • java如何实现post请求webservice服务端

    java如何实现post请求webservice服务端

    这篇文章主要介绍了java如何实现post请求webservice服务端,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详解Java 中的函数式接口

    详解Java 中的函数式接口

    这篇文章主要为大家介绍了Java中的函数式接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • 详解使用spring boot admin监控spring cloud应用程序

    详解使用spring boot admin监控spring cloud应用程序

    这篇文章主要介绍了详解使用spring boot admin监控spring cloud应用程序,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • SpringBoot集成图片验证码框架easy-captcha的详细过程

    SpringBoot集成图片验证码框架easy-captcha的详细过程

    本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是一款轻量级的开源验证码框架,通过简洁的API和高度可定制性,可以快速实现验证码功能,文章详细介绍了如何配置、生成和展示验证码,并提供了Easy-Captcha的GitHub地址
    2025-03-03
  • SpringMVC + servlet3.0 文件上传的配置和实现代码

    SpringMVC + servlet3.0 文件上传的配置和实现代码

    本篇文章主要介绍了SpringMVC + servlet3.0 文件上传的配置和实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • 解决idea web 配置相对路径问题

    解决idea web 配置相对路径问题

    这篇文章主要介绍了idea web 配置相对路径问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Java 8中Collectors.toMap空指针异常源码解析

    Java 8中Collectors.toMap空指针异常源码解析

    这篇文章主要为大家介绍了Java 8中Collectors.toMap空指针异常源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringBoot项目后端开发逻辑全面梳理

    SpringBoot项目后端开发逻辑全面梳理

    这篇文章主要介绍了SpringBoot项目后端开发逻辑全面梳理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring security基于数据库中账户密码认证

    Spring security基于数据库中账户密码认证

    这篇文章主要介绍了Spring security基于数据库中账户密码认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论