SpringBoot文件上传下载

单文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单上传文件</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<!--form表单形式上传-->
<form action="/demo/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="multipartFile" id="file" value="上传文件">
    <input type="button" value="ajax形式上传" id="btn" onclick="onUpload()">
    <input type="submit" value="form表单的submit上传">
</form>

<script>
    //var onUpload = function(){}
    //ajax形式上传
    function onUpload() {
        //$("#multipartFile")[0]表示获取到js对象,files[0]表示获取到上传文件的第一个
        var file = $("#file")[0].files[0];
        var formData = new FormData(); //这个对象是可以让我们模拟form表单的提交
        formData.append("multipartFile", file);
        formData.append("isOnline", 1);
        $.ajax({
            type: "POST",
            url: "/demo/upload",
            data: formData,
            processData: false,  //这里设置为false表示不让ajax帮我们把文件转换为对象格式,这里必须设置为false
            contentType: false,   //这里也要设置为false,不设置可能会出问题
            success: function (msg) {
                console.log(msg)
                alert("上传文件成功");
            }
        })
    }
</script>
</body>
</html>
/**
 * 单文件上传
 * 页面链接:/demo/upload
 * @param multipartFile
 * @param request
 * @param response
 * @return
 * @throws IOException
 */
@PostMapping("/demo/upload")
@ResponseBody
//将上传的文件放在tomcat目录下面的file文件夹中
public String upload(MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response) throws IOException {
    //获取到原文件全名
    String originalFilename = multipartFile.getOriginalFilename();
    // request.getServletContext().getRealPath("")这里不能使用这个,这个是获取servlet的对象,并获取到的一个临时文件的路径,所以这里不能使用这个
    //这里获取到我们项目的根目录,classpath下面
    String realPath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String format = simpleDateFormat.format(new Date());
    //文件夹路径,这里以时间作为目录
    String path = realPath + "static/" + format;
    //判断文件夹是否存在,存在就不需要重新创建,不存在就创建
    File file = new File(path);
    if (!file.exists()) {
        file.mkdirs();
    }

    //转换成对应的文件存储,new File第一个参数是目录的路径,第二个参数是文件的完整名字
    multipartFile.transferTo(new File(file, originalFilename));

    //上传文件的全路径
    String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/" + format + "/" + originalFilename;
    return url;
}

多文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多上传文件</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<form action="/demo/upload2" method="post" enctype="multipart/form-data">
    <input type="file" name="files" multiple value="多文件上传"> <!--accept可以指定上传文件类型,例如 accept="image/*"-->
    <input type="submit" value="多文件上传">
</form>
</body>
</html>
/**
 * 多文件上传
 * 页面链接:/demo/upload2
 * @param files
 * @param request
 * @param response
 * @return
 * @throws IOException
 */
@PostMapping("/demo/upload2")
@ResponseBody
//将上传的文件放在tomcat目录下面的file文件夹中
public String upload2(MultipartFile[] files, HttpServletRequest request, HttpServletResponse response) throws IOException {
    List<String> list = new ArrayList<>();
    //System.out.println(files.length);
    for (MultipartFile multipartFile : files) {
        //获取到文件全名
        String originalFilename = multipartFile.getOriginalFilename();
        // request.getServletContext()。getRealPath("")这里不能使用这个,这个是获取servlet的对象,并获取到的一个临时文件的路径,所以这里不能使用这个
        //这里获取到我们项目的根目录,classpath下面
        String realPath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String format = simpleDateFormat.format(new Date());
        //文件夹路径,这里以时间作为目录
        String path = realPath + "static/" + format;
        //判断文件夹是否存在,存在就不需要重新创建,不存在就创建
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }

        //转换成对应的文件存储,new File第一个参数是目录的路径,第二个参数是文件的完整名字
        multipartFile.transferTo(new File(file, originalFilename));

        //上传文件的全路径,一般是放在tomcat中
        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/" + format + "/" + originalFilename;
        //System.out.println("url=》》》》》"+url);
        list.add(url);
    }
    return new ObjectMapper().writeValueAsString(list);
}

下载、在线查看

/**
 * 下载、在线查看
 * @param request
 * @param response
 * @param name
 * @param isOnline
 * @throws IOException
 */
@RequestMapping("/demo/download")
public void download(HttpServletRequest request, HttpServletResponse response, String name, @RequestParam(defaultValue = "0") int isOnline) throws IOException {
    try (ServletOutputStream outputStream = response.getOutputStream();) {
        /*
        这里要使用ResourceUtils来获取到我们项目的根目录
        不能使用request.getServletContext().getRealPath("/"),这里获取的是临时文件的根目录(所以不能使用这个)
        */
        String path = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String format = simpleDateFormat.format(new Date());
        String realPath = path + "static/" + format + "/" + name;
        File file = new File(realPath);
        //如果下载的文件不存在
        if (!file.exists()) {
            response.setContentType("text/html;charset=utf-8");
            //response.getWriter().write(str);这种写入的就相当于生成了jsp/html,返回html/jsp,所以需要我们进行contentType的设置
            response.getWriter().write("下载的文件不存在");
            return;
        }

        InputStream in = new FileInputStream(realPath);
        int read;

        //byte[] b = new byte[in.available()];创建一个输入流大小的字节数组,然后把输入流中所有的数据都写入到数组中
        byte[] b = new byte[1024];
        /*
        1、Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
        2、attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
        3、filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
        */
        /*	注意:文件名字如果是中文会出现乱码:解决办法:
            1、将name 替换为 new String(filename.getBytes(), "ISO8859-1");
            2、将name 替换为 URLEncoder.encode(filename, "utf-8");
        */
        if (isOnline == 0) {
            //在线打开
            response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(name, "utf-8"));
        } else {
            //下载形式,一般跟application/octet-stream一起使用
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name, "utf-8"));
            //如果单纯写这个也可以进行下载功能,表示以二进制流的形式
            response.setContentType("application/octet-stream");
        }
        //文件大小
        response.addHeader("Content-Length", "" + file.length());
        while ((read = in.read(b)) > 0) {
            outputStream.write(b);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;
    }
}

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值