Java 原生实现上传和下载

一 上传和下载

01 上传操作

1、方案一

要求:

前端页面:
    form 表单的要求:
        1、提交方式必须是 post 提交。
        2、需要指定表单的类型 enctype="multipart/form-data"
        3、需要指定 input 标签的 type="file" name="xxx"
​
后端实现:
    Servlet 当中的实现
        1、在Servlet当中需要指定注解 @MultipartConfig
        2、获取到 part 的值, 采用请求进行获取 Part p =req.getPart("xxx");
        3、写数据到指定路径 p.write("路径");

代码:

位置 web/upload/upload01.jsp

<%--
    http://localhost:8080/JavaWebDay21/upload/upload01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传版本1</title>
</head>
<body>
<h1> 文件上传版本1 - Part 原始版本 </h1>

<form
        method="post"
        enctype="multipart/form-data"
        action="${pageContext.request.contextPath}/UpLoad01Servlet">
    <input type="text" name="username" placeholder="普通文本"> <br>
    <input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
    <input type="submit" value="提交数据到服务器">
</form>

</body>
</html>

位置: src/blb.chc02.UpLoad01Servlet

/***
 * 强调: 这里需要加上注解  @MultipartConfig 表示支持 part提交的方式
 */
@WebServlet("/UpLoad01Servlet")
@MultipartConfig
public class UpLoad01Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UpLoad01Servlet.doGet");
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UpLoad01Servlet.doPost");
        //获取到数据,获取到普通文本框的数据
        String username = req.getParameter("username");
        System.out.println("username = " + username);
        //获取到文件的数据。文件需要通过 getPart("xxx") 获取
        Part p = req.getPart("upfile");
        //获取到文件的名称
        String fileName = p.getSubmittedFileName();
        //获取到准备存放文件的路径
        String path = req.getServletContext().getRealPath("/");
        System.out.println("path = " + path);
        //准备写数据
        p.write(path + "/" + fileName);
    }
}

2、方案二

要求:

前端页面:
    form 表单的要求:
        1、提交方式必须是 post 提交。
        2、需要指定表单的类型 enctype="multipart/form-data"
        3、需要指定 input 标签的 type="file" name="xxx"
​
后端实现:
    导入两个 jar 包:
        1、commons-fileupload-1.3.1.jar
        2、commons-io-2.4.jar
    Servlet 当中的实现
        1、在Servlet当中操作流程:
            A. 磁盘工厂     DiskFileItemFactory
            B. 上传文件对象  ServletFileUpload
            C. 表单项集合    List<FileItem>
        2、对集合进行遍历,获取得到FileItem
            A. 判断是否是 普通的文本输入框  fileItem.isFormField()
            B. 判断是否不为 普通文本输入框,那么就是 上传的输入框

代码:

位置 web/upload/upload02.jsp

<%--
    http://localhost:8080/JavaWebDay21/upload/upload02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传版本2</title>
</head>
<body>
<h1> 文件上传版本2 - FileUpload 版本 </h1>

<form
        method="post"
        enctype="multipart/form-data"
        action="${pageContext.request.contextPath}/UpLoad02Servlet">
    <input type="text" name="username" placeholder="普通文本"> <br>
    <input type="file" name="upfile" placeholder="选择你需要上传的文件"> <br>
    <input type="submit" value="提交数据到服务器">
</form>
</body>
</html>

位置 src/blb.chc02.UpLoad02Servlet

02 下载操作

1、方案一

要求:

前端页面:
    可以使用超链接,完成下载的功能。    
    1、直接在超链接上面添加 download 属性,就可以完成下载。同时还可以指定下载的文件名称
    2、如果当前的超链接标签,不能被浏览器解析,则直接判定为下载的操作

代码:

位置 web/download/download01.jsp

​
@WebServlet("/UpLoad02Servlet")
public class UpLoad02Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UpLoad02Servlet.doGet");
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UpLoad02Servlet.doPost");
        try {
            //定义一个普通的方法,用于接收请求和响应,作为文件上传的操作
            upload(req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //自己定义的文件上传的方法,这里可能存在异常,为了让大家看代码更加舒服一点
    protected void upload(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        //判断一下,是否是文件上传的表单, 如果不是文件上传的类型,则直接返回
        if (!ServletFileUpload.isMultipartContent(req)) {
            return;
        }
        //流程: 磁盘工厂 DiskFileItemFactory --> 上传文件对象 ServletFileUpload --> 表单集合 List<FileItem>
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload load = new ServletFileUpload(factory);
        List<FileItem> fileItems = load.parseRequest(req);
        //针对于集合,进行循环遍历
        for (FileItem item : fileItems) {
            //判断当前的类型是否是普通文本类型,只有两种类型:1、普通文本,2、文件类型 type="file"
            if (item.isFormField()) {
                //如果是普通文本类型,只需要得到键和和值
                String name = item.getFieldName();
                String value = item.getString("UTF-8");
                System.out.println(name + " = " + value);
            }else{
                //如果是文件的类型,需要得到文件的名称
                String name = item.getName();
                //准备上传的路径,上传文件之后,保存文件的路径
                String path = req.getServletContext().getRealPath("/");
                System.out.println("path = " + path);
                //创建文件的对象
                File f = new File(path,name);
                //存放文件
                item.write(f);
            }
        }
    }
}

​

02 下载操作

1、方案一

要求:

前端页面:
    可以使用超链接,完成下载的功能。    
    1、直接在超链接上面添加 download 属性,就可以完成下载。同时还可以指定下载的文件名称
    2、如果当前的超链接标签,不能被浏览器解析,则直接判定为下载的操作

代码:

位置 web/download/download01.jsp

<%--
    http://localhost:8080/JavaWebDay21/download/download01.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>下载的操作-超链接完成下载</title>
</head>
<body>

<h1> 超链接完成下载功能 </h1>

<h3> 展示界面 </h3>

如果不能正常解析的文件,则直接判定为下载。<br><hr>

<a href="face.png"> 展示图片 </a> <br>
<a href="hello.txt"> 展示文本 </a> <br>
<a href="Demo.zip"> 展示压缩包,无法解析则下载 </a> <br>
<a href="chui.mp3"> 展示音乐 </a> <br>

<h3> 下载界面 </h3>
指定 download属性可以实现下载,如果想要指定名称,则指定download的属性值。<br><hr>

<a href="face.png" download> 下载图片 </a> <br>
<a href="hello.txt" download>下载文本 </a> <br>
<a href="Demo.zip"> 下载压缩包 </a> <br>
<a href="chui.mp3" download="大风吹.mp3"> 下载音乐 </a> <br>


</body>
</html>

2、方案二

要求:后端页面:
    直接响应一段浏览器无法识别的操作,浏览器会自动帮我们下载。可以去设置响应头的信息。
    1、设置响应头信息:
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition","attachement;filename="+filename);
    2、采用IO流读写数据
        FileInputStream is = new FileInputStream("路径或者对象");
        ServletOutputStream os = response.getOutputStream();

代码:

位置 web/download/download02.jsp

<%--
    http://localhost:8080/JavaWebDay21/download/download02.jsp
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>采用后端代码完成下载</title>
</head>
<body>

<h1>后端代码完成下载功能</h1>

文件列表信息如下:

<ul>
    <li> chui.mp3 </li>
    <li> Demo.zip </li>
    <li> face.png </li>
    <li> hello.txt </li>
</ul>

<form method="get" action="${pageContext.request.contextPath}/DownLoad02Servlet">
    <input type="text" name="filename" placeholder="请输入上述的文件名称">
    <input type="submit" value="提交则完成下载">
</form>

</body>
</html>

位置:src/blb.chc03.DownLoad02Servlet

@WebServlet("/DownLoad02Servlet")
public class DownLoad02Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DownLoad02Servlet.doGet");
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DownLoad02Servlet.doPost");
        //可以获取到请求的参数
        String filename = req.getParameter("filename");
        //可以获取到资源文件的路径
        String path = req.getServletContext().getRealPath("/download");
        //封装成为File对象
        File f = new File(path,filename);
        //判断文件如果不存在,则直接返回
        if (!f.exists()){
            System.out.println("文件不存在... "+f);
            return;
        }
        //如果文件存在,则响应文件到浏览器当中
        resp.setContentType("application/x-msdownload");
        resp.setHeader("Content-Disposition","attachement;filename="+filename);
        //获取流对象
        FileInputStream is = new FileInputStream(f);
        ServletOutputStream os = resp.getOutputStream();
        //读写操作
        byte[] array = new byte[1024];
        int len;
        while ((len = is.read(array))!=-1){
            os.write(array,0,len);
            os.flush();
        }
        //释放资源
        os.close();
        is.close();
    }
}

MinIO 是一个开源的对象存储服务器,常用于云原生应用中。要在 Java实现 MinIO 的上传下载功能,你可以使用官方提供的 MinIO SDK。以下是简单的步骤: 1. **添加依赖**: 首先,你需要通过 Maven 或 Gradle 添加 MinIO SDK 到你的项目中。对于 Maven,添加到 `pom.xml` 文件: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>latest版本号</version> </dependency> ``` 更新`latest版本号`为实际的 MinIO SDK 版本。 2. **初始化连接**: 创建一个 `MinioClient` 实例,需要提供 endpoint (存储服务器地址) 和 access key (访问密钥): ```java Minio minioClient = new Minio("http://your-minio-endpoint.com", "ACCESS_KEY", "SECRET_KEY"); ``` 3. **上传文件**: 要上传文件,可以使用 `putObject()` 方法: ```java String bucketName = "your-bucket-name"; String objectName = "path/to/local/file.txt"; File file = new File(objectName); minioClient.putObject(bucketName, objectName, file); ``` 4. **下载文件**: 下载文件同样使用 `getObject()` 方法: ```java Response response = minioClient.getObject(new GetObjectRequest(bucketName, objectName)); InputStream inputStream = response.data(); // 将流保存到本地文件或其他目的地 File outputFile = new File("path/to/downloaded/file.txt"); Files.copy(inputStream, outputFile.toPath()); ``` 5. **错误处理**: 始终记得捕获异常并妥善处理网络错误、权限问题等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚几哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值