文件上传和下载_一念流转的博客-程序员秘密_叠加上传文件是什么意思

技术标签: Java后端  

很多人都接触过文件上传和下载,比如JavaWeb。
在这里我记录一下在Spring框架中的此类基本操作,水平有限,不喜勿喷。

首先编写好前端ftl格式的界面

<p>单文件上传</p>
<form action="upload" method="POST" enctype="multipart/form-data">
    文件:<input type="file" name="file">
    <input type="submit">
</form>

<p>文件下载</p>
<p><a href="download">下载文件</a></p>

<p>多文件上传</p>
<form action="batch" method="POST" enctype="multipart/form-data">
    <p>文件1:<input type="file" name="file"></p>
    <p>文件2:<input type="file" name="file"></p>
    <p><input type="submit" value="上传"></p>
</form>
</body>

配置对外访问路径fileUpload

@GetMapping("/fileUpload")
public String fileUpload(ModelMap modelMap){
    
    modelMap.addAttribute("msg", "文件上传下载");
    return "fileUpload";
}

对于单文件上传操作,主要通过流的方式,把前端上传的文件写入到服务端指定位置。对于File中的transferTo方法,我是试了一下发现上传的文件内容为空,不知道问题出在什么地方

@RequestMapping(value = "/upload")
public String upload(@RequestParam("file")MultipartFile file){
    
    if (file.isEmpty()){
    
        return "file is null";
    }
    String fileName = file.getOriginalFilename();
    log.info("upload filename: "+ fileName);

    File dest = new File(filePath);
    if (!dest.exists()){
    
        dest.mkdirs();
    }
    try {
    
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest,fileName)));
        byte[] bytes = file.getBytes();
        bos.write(bytes);
        bos.close();
        return "upload ok";
    } catch (IOException e) {
    
        e.printStackTrace();
    }
    return "upload wrong";
}

多文件上传操作类似于单文件上传操作,是单文件上传的叠加,也是通过流的方式。

@PostMapping("/batch")
public String handleFileUpload(HttpServletRequest request){
    
    List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("file");
    MultipartFile file = null;
    BufferedOutputStream stream = null;
    for (int i = 0; i < files.size(); i++) {
    
        file = files.get(i);
        if (!file.isEmpty()){
    
            try {
    
                byte[] bytes = file.getBytes();
                stream = new BufferedOutputStream(new FileOutputStream(new File(filePath+file.getOriginalFilename())));
                stream.write(bytes);
                stream.close();
            } catch (IOException e) {
    
                stream = null;
                return "number "+i+" upload wrong "+e.getMessage();
            }
        }else {
    
            return "number "+i+" upload wrong , because file is null";
        }
    }
    return "upload ok";
}

我这边是硬编码指定了一个下载文件,对于下载操作,要设置好响应头中的项,比如文件名,文件长度等

@GetMapping("/download")
public String downloadFile(HttpServletResponse response){
    
    String fileName = "readme.txt";
    if (fileName != null){
    
        File file = new File(filePath+fileName);
        if (file.exists()){
    
            response.setContentType("application/force-download");//强制下载不打开
            response.addHeader("Content-Disposition", "attachment;fileName="+fileName);//文件名
            response.setContentLength((int)file.length());
            response.setCharacterEncoding("utf-8");

            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
    
                bis = new BufferedInputStream(new FileInputStream(file));
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1){
    
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
                return "down ok";
            } catch (Exception e) {
    
                e.printStackTrace();
            }finally {
    
                if (bis != null){
    
                    try {
    
                        bis.close();
                    } catch (IOException e) {
    
                        e.printStackTrace();
                    }
                }
                if (fis != null){
    
                    try {
    
                        fis.close();
                    } catch (IOException e) {
    
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    return "down wrong";
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35334269/article/details/106036104

智能推荐

C#程序以及抓包_古岐川的博客-程序员秘密_c# 抓包

新建项目写接收方①建立新文件UDPsever②给项目取名字为UDPsverer③写入代码using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace server{ class Program {

mysql 数字正则_mysql 正则_weixin_39973009的博客-程序员秘密

mysql 正则学习基本字符匹配select desk from dealer_info where desk regexp "82107777";. 表示匹配任意一个字符select name from dealer_info where name regexp "a.";MySQL中的正则表达式匹配不区分大小写, 可以使用 binary来区分select name from dealer_i...

vue+element-ui table表格一个单元格中添加多行数据_weixin_45115895的博客-程序员秘密_element table一个单元格

vue+element-ui table表格一个单元格中添加多行数据话不多说,先上效果图,值得借鉴可以接着往下看项目中有这样的需求,需要把所有数据按组的方式进行划分并打包,如果一个商品一条数据的话就显得太繁琐,用户体验并不好,于是乎就想到上面这种方式进行渲染和操作,有了想法就去找实现方式呗直接去翻了elementui组件,竟然没有这种渲染方式,那就只有另辟蹊径了:在table表格一个单元格中使用template自定义内容再添加一个table表格,结果就如上图所示了&lt;el-table :da

Layer Normalization翻译_nopSled的博客-程序员秘密_layer normalization翻译

摘要训练好的深度神经网络在计算上是昂贵的。减少训练时间的一种方法是归一化神经元的激活。最近引入的称为批量归一化(batch normalization)的技术使用在一小批训练样例中对神经元的加权输入的分布来计算均值和方差,然后将其用于在每个训练样例中对该神经元的加权输入进行归一化。这显着减少了前馈神经网络中的训练时间。然而,批量归一化的效果取决于小批量大小,并且如何将其应用于递归神经网络并不明显...

形式逻辑(02)逻辑概述 & 负判断_图王大胜的博客-程序员秘密_分析判断类型,要把负判断改过来再判断吗?

1 逻辑概述1.1 判断及其分类@1 判断的定义:判断是对事物情况有所断定的思维形式。 例如: 现在是春天、一加一等于三、我今天没有吃早饭 。@2判断的特征(1)有所断定。如果对对象既无所肯定,也无所否定,那不是判断。(2)有真有假。判断是对客观事物有所断定的一种思维类型,是对客观事物情况的反映, 而不是客观事物本身。因此,就存在是否真实地反映客观事物实际的问题。@3判断的分类1.2 推理及其分类@1 推理的定义:推理就是根据一个或一些判断得出另一个判断的思维过程。起..

IDE & Framework之Anaconda使用记录20200428-_NeXT_Vision的博客-程序员秘密

Anaconda中安装opencvanaconda安装opencv_人工智能_the Blog of Dale无双 20181021打开Anaconda Prompt,键入以下命令便可安装成功,只是下载速度较慢activate my_cpu_py3conda install opencv# 测试opencv是否安装成功pythonimport cv2print(cv2.__ve...

随便推点

Tensorflow 学习之Google Object Detection api 的学习(二)检测自己的图片_qq_15205173的博客-程序员秘密

环境 :win10 + tensorflow前期准备:完成object detection api 的配置 环境配置(一)图片准备下载labelimg 有很多种方法这里 列出几种1.去github 上下载附上链接 https://github.com/tzutalin/labelImg/releaseslabelimg下载下载后直接解压运行labelimg.exe2.有pycha...

wenet 频谱增强的原理和代码实现_少游223的博客-程序员秘密_specaug原理

原理:该方法实在u2++中作为第二个创新点提出的,其作用是使模型见多识广,更加robust。主要思路是随机用之前的chunk来代替当前的chunk。论文位置:https://arxiv.org/pdf/2106.05642.pdf详见文章的3.2.3小结代码位置:https://github.com/wenet-e2e/wenet/blob/main/wenet/dataset/dataset_deprecated.py代码分析:————————————_spec_aug_me.

Ajax学习参考文档_杨 戬的博客-程序员秘密_ajax学习文档

文章目录1. 概述2. 快速上手2.1. readyState2.1.1. 时间轴2.2. 遵循 HTTP3. 具体用法3.1. GET 请求3.2. POST 请求3.3. 同步与异步3.4. 响应数据格式3.4.1. XML3.4.2. JSON3.5. 处理响应数据渲染3.6. 兼容方案4. 封装4.2. jQuery 中的 AJAX4.2.1. $.ajax4.2.2. $.get4.2.3. $.post4.2.4. 全局事件处理4.2.5. 自学内容(作业)5. 跨域5.1. 相关概念5.2.

Echart: legend图例的icon开启或关闭时大小样式设置_echarts关闭图例_HaanLen的博客-程序员秘密

legend: { data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine'], icon:'circle', }, legend: { data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine'], icon: 'circle', itemHeight: 10, itemWidth: 20...

LeetCode 136. 只出现一次的数字【c++/java详细题解】_林小鹿@的博客-程序员秘密_169. 多数元素c++

目录1、题目2、思路3、c++代码4、java代码1、题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 42、思路(位运算) O(n)O(n)O(n)异或运算有以下三个性质:1、0^0 = 0 ,0^1 = 1,0异或任何数=任何数2、1^0 = 1 ,1^1

Dubbo 面试 18 问!这些你都会吗?_爱圈t的博客-程序员秘密_简历上关于dubbo怎么写

dubbo是什么dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使...

推荐文章

热门文章

相关标签