文件上传和下载

Posted Vodka~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传和下载相关的知识,希望对你有一定的参考价值。

1.完整的文件上传:前台发送文件,后台接收并保存文件。
2.前端: - 在文件上传时,上传文件的界面主要由表单界面组成,表单的请求方式为:POST;
-form 表单的 enctype 必须设置为 “multipart/form-data”,即 enctype=“multipart/form-data”,
作用是设置表单的类型为文件上传表单。
-默认情况下表单类型为: “application/x-www-urlencoded”,不能用于文件上传。只有使用了multipart/form-data才能完整地传递文件数据。

  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<!--
    1.设置表单提交方法为: method="post"
    2.设置表单类型为(文件上传表单):enctype="multipart/form-data"
    3.设置接收表单内容的地址(action)
    4.设置表单元素:
             -普通表单项   type="text"
             -文件项     type="file"
    5.设置表单元素的name值(后端接收数据的辨别依据)
-->
   <form enctype="multipart/form-data" method="post" action="UploadServer">
       项目:<input type="text" name="Item"> <br>
       文件上传: <input type="file" name="ItmeFiles">  <br>
<!--       button的默认类型是提交类型 type="submit" -->
       <button type="submit">提交</button>
   </form>

</body>
</html>
package com.StartSL;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * @author Vodka
 * @date 2021/08//11:13
 */
//必须使用注解 @MultipartConfig 将一个Servlet标示为支持文件上传,
// Servlet 将multipart/form-data 的post请求封装成Part,再通过Part进行文件相关操作
    @WebServlet(urlPatterns = {"/UploadServer"})
    @MultipartConfig
public class UploadFile extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res){
//         设置请求的编码格式
        try {
            req.setCharacterEncoding("UTF-8");
            // 获取普通表单项 (文本框)
            String Item = req.getParameter("Item");
            System.out.println("项目名称:"+Item);
//       通过 getPart(name); 获取Part对象     (name代表页面中file文件域的name属性值)
            Part part = req.getPart("ItemFiles");
//            通过Part对象,获取上传文件名
            String  fileName = part.getSubmittedFileName();
            System.out.println("上传的文件名称:"+fileName);
//            获取上传文件需要存放的路径(真实路径)
            String realPath = req.getServletContext().getRealPath("/");
            System.out.println("项目存放的路径:" + realPath);
//            将文件上传到指定位置
            part.write(realPath + "/" + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

3.文件下载:将服务器上的资源下载(拷贝)到本地,可以通过两种方式下载:
-超链接本身的特性来下载
-通过代码下载

4.超链接下载: 当html或jsp页面中使用(超链接)a标签时,当超链接遇到浏览器不能识别的资源会自动下载;
当浏览器遇见能够直接显示的资源,会默认显示出来,比如txt,png,jpg等。

<!--当超链接遇到浏览器不识别的资源时,会自动下载-->
<a href="test.zip">超链接下载</a>


<!--
 当超链接遇到浏览器识别的资源,默认不会下载,可以通过指定download属性下载,
 download属性可以不写任何信息,会自动使用默认文件名,若设置了download属性的值,则使用设置的值作为文件名
-->
<a href="test.txt" download>指定download下载</a>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
<!--   浏览器能识别的资源,点击之后能在浏览器呈现-->
    <a href="download/vodka.txt">文件资源</a>
    <a href="download/img2.jpg">图片资源</a>
<!--浏览器不能识别的资源,点击链接之后则自动下载-->
    <a href="download/commute.zip">压缩资源</a>

<!--设置了download属性(下载的文件的名称),则不管浏览器能不能识别,点击之后则会直接下载资源-->
    <a href="download/img2.jpg" download="猫咪.jpg">点击下载</a>
</body>
</html>


<form method="get" action="One">
    文件名:<input type="text" name="FileName" placeholder="请输入要下载的文件名">
    <button >下载</button>
package com.StartSL;

import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

/**
 * @author Vodka
 * @date 2021/08//11:27
 */

/*
*    后台实现下载:
*        1.通过response.setContentType 方法设置 Content-type 头字段的值为浏览器无法使用某种方式或
*           激活某个程序来处理的 MIME类型,例如 “application/octet-stream”或“application/x-msdownload”等
*        2.通过response.setHeader 方法设置 Content-Disposition 头的值为"attachment;filename=文件名"
*        3.读取下载文件,调用response.getOutputStream 方法向客户端写入附件内容。
* */
    @WebServlet("/One")
public class LoadInBack extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res){
        System.out.println("请求下载");
//         设置请求编码
        try {
            req.setCharacterEncoding("UTF-8");
            res.setContentType("text/html;charset=utf-8");
//            设置文件下载路径
            String Path = getServletContext().getRealPath("/download/");
//            获取要下载的文件名
            String Name = req.getParameter("FileName");
//            通过路径得到file对象
            File filePath = new  File(Path + Name);
//            判断file对象是否存在,并且是否符合标准文件格式
            if(filePath.exists() && filePath.isFile()){
//              设置响应类型(该类型为浏览器无法使用某种方式或激活某个程序来处理的类型)
                res.setContentType("application/x-msdownload");
//                设置头信息
                res.setHeader("Content-Disposition","attachment;filename="+Name);
//                得到输入流
                InputStream is = new FileInputStream(filePath);
//                得到输出流
                ServletOutputStream os = res.getOutputStream();
//                定义byte数组
                byte[] Filecar =  new byte[1024];
                int length = 0 ;
//               将输入流的数据循环输出到输出流
                while((length = is.read(Filecar)) != -1){
                    os.write(Filecar,0,length);   //每装满一次Filecar都输出到输出流中
                }
//                关闭流 释放资源
                os.close();
                is.close();
            }else{
                res.getWriter().write("请输入要下载的文件名!");
                res.getWriter().close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

以上是关于文件上传和下载的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

大文件上传下载分片断点续传教程

Alamofire 文件上传出现错误“JSON 文本未以数组或对象开头,并且允许未设置片段的选项”

VIM 代码片段插件 ultisnips 使用教程

代码学习PHP文件的上传和下载

SpringMVC_[4]文件上传和下载