文件上传下载(SpringBoot)- 常用功能-程序员宅基地

配置 

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.MultipartConfigElement;

/**
 * 上传文件配置
 * @author yuhao
 */
@Configuration
public class MultipartConfig {
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        // 置文件大小限制 ,超出此大小页面会抛出异常信息//KB,MB
        factory.setMaxFileSize("100MB");
        // 设置总上传数据总大小
        factory.setMaxRequestSize("100MB");
        // 设置文件临时文件夹路径
        // factory.setLocation("E://test//");
        // 如果文件大于这个值,将以文件的形式存储,如果小于这个值文件将存储在内存中,默认为0
        // factory.setMaxRequestSize(0);
        return factory.createMultipartConfig();
    }
}

controller 

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
@Api(tags = "文件上传", description = "FileController")
@RequestMapping(value = "/file")
@SuppressWarnings("all")
public class FileController {
//    @Autowired
//    private imgService service;

    //获取主机端口
    @Value("${server.port}")
    private String port;
    //获取本机ip
    @Value("${server.host}")
    private String host;


    //图片存放根路径
    private String rootPath = "C:";
    //用户上传图片存放根目录下的子目录
    private String sonPath = "/file/";
    //日期目录
    private String datePath;
    //获取图片链接
    private String imgPath;

    private static final Logger logger = LoggerFactory.getLogger(FileController.class);

    @PostMapping(value = "/upload")
    @ApiOperation(value = "单文件上传")
    public Result upload(@RequestParam("file") MultipartFile file) {
        //返回上传的文件是否为空,即没有选择任何文件,或者所选文件没有内容。
        //防止上传空文件导致奔溃
        if (file.isEmpty()) {
            return fail("文件为空");
        }

        //获取本机IP
//        try {
//            host = InetAddress.getLocalHost().getHostAddress();
//        } catch (UnknownHostException e) {
//            logger.error("get server host Exception e:", e);
//        }

        // 获取文件名
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));

        if (Constants.SUFFIX_IMAGE.contains(suffixName.toLowerCase())) {
            sonPath = "/file/imgs/";
        }
        if (Constants.SUFFIX_AUDIO.contains(suffixName.toLowerCase())) {
            sonPath = "/file/audio/";
        }
        if (Constants.SUFFIX_VIDEO.contains(suffixName.toLowerCase())) {
            sonPath = "/file/video/";
        }

        logger.info("上传的文件名为:" + fileName);
        // 设置文件上传后的路径
        // 解决中文问题,liunx下中文路径,图片显示问题
        fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
                + "-" + UUIDUtil.getUUID() + suffixName;

        datePath = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/";

        String filePath = rootPath + sonPath + datePath;

        logger.info("上传的文件路径" + filePath);
        logger.info("整个图片路径:" + "http://" + host + ":" + port + sonPath + datePath + fileName);
        //创建文件路径
        File dest = new File(filePath + fileName);

        imgPath = (host + ":" + port + sonPath + datePath + fileName).toString();

        // 检测是否存在目录
        if (!dest.getParentFile().exists()) {
            //假如文件不存在即重新创建新的文件已防止异常发生
            dest.getParentFile().mkdirs();
        }
        try {
            //transferTo(dest)方法将上传文件写到服务器上指定的文件
            file.transferTo(dest);
            //将链接保存到URL中
            //imgTest imgTest = service.add(new imgTest(), imgPath);

            return success((sonPath + datePath + fileName).toString());
        } catch (Exception e) {

            return fail("上传失败");
        }
    }

    @PostMapping(value = "/uploadBatch")
    @ApiOperation(value = "批量文件上传")
    public Result uploadBatch(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) {
        //List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
        BufferedOutputStream stream = null;
        List<String> result = new ArrayList<>();
        for (MultipartFile file : files) {

            if (!file.isEmpty()) {
                // 获取文件名
                String fileName = file.getOriginalFilename();
                String suffixName = fileName.substring(fileName.lastIndexOf("."));

                if (Constants.SUFFIX_IMAGE.contains(suffixName.toLowerCase())) {
                    sonPath = "/file/imgs/";
                }
                if (Constants.SUFFIX_AUDIO.contains(suffixName.toLowerCase())) {
                    sonPath = "/file/audio/";
                }
                if (Constants.SUFFIX_VIDEO.contains(suffixName.toLowerCase())) {
                    sonPath = "/file/video/";
                }

                logger.info("上传的文件名为:" + fileName);
                // 设置文件上传后的路径

                // 解决中文问题,liunx下中文路径,图片显示问题
                fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
                        + "-" + UUIDUtil.getUUID() + suffixName;

                datePath = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/";

                String filePath = rootPath + sonPath + datePath;
                logger.info("上传的文件路径" + filePath);
                logger.info("整个图片路径:" + host + ":" + port + sonPath + datePath + fileName);
                //创建文件路径
                File dest = new File(filePath + fileName);

                if (!dest.getParentFile().exists()) {
                    //假如文件不存在即重新创建新的文件已防止异常发生
                    dest.getParentFile().mkdirs();
                }

                try {
//                    byte[] bytes = file.getBytes();
//                    stream = new BufferedOutputStream(new FileOutputStream(dest));
//                    stream.write(bytes);
//                    stream.close();
                    //transferTo(dest)方法将上传文件写到服务器上指定的文件
                    file.transferTo(dest);
                    result.add((sonPath + datePath + fileName).toString());
                } catch (Exception e) {
                    stream = null;
                    return fail("You failed to upload " + " => " + e.getMessage());
                }
            } else {
                return fail("You failed to upload " + " because the file was empty.");
            }

        }
        return success(result);
    }


    //文件下载相关代码
    @GetMapping("/download")
    @ApiOperation(value = "文件下载")
    public ResponseEntity downloadFile(HttpServletRequest request, HttpServletResponse response,
                                       @ApiParam(value = "文件名", required = true) @RequestParam(name = "fileName", required = true) String fileName) {
        //String fileName = "aim_test.txt";// 设置文件名,根据业务需要替换成要下载的文件名
        if (fileName != null) {
            //设置文件路径
            String realPath = "C:\\imgs\\";
            File file = new File(realPath, fileName);
            if (file.exists()) {
                response.setContentType("application/force-download");// 设置强制下载不打开
                response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    /*int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }*/
                    int bytesRead = 0;
                    while ((bytesRead = bis.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                    System.out.println("success");
                    return null;
                } 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 null;
    }


}


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40625058/article/details/86489691

智能推荐

python中难的算法_一个python的比较难的算法,有懂的人可以进来一下_小鹿老师的博客-程序员宅基地

我的需求:结构数据是这样的:要求按照这样的公式:组合一: 时间词+地方词+动词+等级+名词+价格词;比如2016年深圳大鹏新区给健康全身检查要多少钱就是按照这样的公式组合出来的关键词那么有什么办法用最短的办法来实现,我下面是我的算法,用pandas的算法:for times in df[df["时间词"].notnull()]["时间词"]:for area in df[df["地方词"].not..._python最难算法

如何画出一张合格的技术架构图?-程序员宅基地

架构架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是一系列的决策。架构是结构和愿景。系统架构是概念的体现,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。做好架构是个复杂的任务,也是个很大的话题,本篇就不做深入了。有了架构之后,就需要让干系人理解、遵循相关决策。架构图系统架构图是为了抽象地表示软件系..._技术架构图

java控制台输入的数据存放在数据库表中_JDBC完成修改(使用控制台输入)-程序员宅基地

注意:每次修改Oracle表格都要使用commit提交数据之后再去运行Java代码!* 需求:* 更新用户昵称,更新成功后提示更新成功,* 分析:* java+jdbc* 使用:* 创建java类* 创建main方法* 创建Scanner对象获取控制台数据* 使用JDBC将数据更新到数据库中* 提示更新成功为理解方便,代码中直接抛出了异常,没...

LeetCode 62 不同路径_2.一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “start” )。-程序员宅基地

LeetCode 62 不同路径题目链接一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> _2.一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “start” )。

b类计算机房施工资质要求,B类机房中心机房建设技术规格及要求-程序员宅基地

供配电系统是保证计算机设备、场地设备和辅助设备安全可靠运行的基础,其设计原则是:满足计算机机房的使用要求;保证供电可靠性和灵活性;保证人身安全;便于施工、维修和管理;技术先进,经济合理。电气装臵的安装应做到整齐、牢固、正确、标志明确、外观良好、内外清洁,插座必须安装牢固。按照《电子信息系统机房设计规范》(GB50174-2008)和《电子计算机场地通用规范》(GB/T-2887-2000),在本项..._做机房ups需要什么资质

随便推点

从窗口句柄获取进程句柄并终止进程GetWindowThreadProcessID_根据窗口句柄获取进程-程序员宅基地

_GetODProcID procLOCAL @hWinOD ;窗口句柄LOCAL @hProcessOD ;进程句柄LOCAL @idProcessOD ;进程IDinvoke FindWindow,addr szClassName,NULL ;通过类名获取窗口句柄 .if eax ;_根据窗口句柄获取进程

如何在Apache Calcite里优化关系表达式?-程序员宅基地

final HepProgram hepProgram = new HepProgramBuilder() .addRuleInstance(CalcSplitRule.INSTANCE) .addRuleInstance(FilterTableScanRule.INSTANCE) ....

ASP.NET下MVC1.0->2.0->3.0->4.0发展-程序员宅基地

ASP.NET下的MVC从原始的1.0走到2.0,再到3.0,现在走到4.0,也许明年5.0就问世了,先不管那些,那说说这些MVC在ASP.NET是如何变化发展的。对于.net编程人员来说可能会很熟悉,也有可能不熟悉,我过去做.net一年多,没听说过这个概念,但是昨天看别人的博客(博主书这是.net一个公司的面试题),忽然对这个问题产生了兴趣,于是研究研究,研究的不是很深,供初学者有个浅显的认识。

golang 编译后文件过大问题处理-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ..._go编译sdk太大

Opencv——图像数据获取与存储(imread()和imwrite()函数)_cv::imwrite-程序员宅基地

使用cv::imread()读取一张图片时,并不关心文件的扩展名是什么,而是分析文件中前几个字节(被称为文件识别标识或者“魔法序列”)来确定图像的编码格式。第二个参数flags可以被设置为上述表格中的任意一个值,默认情况下,flag被设置为cv::IMREAD_COLOR。这个值表示图片将被以三通道8位的格式读取。在这种情况下即使原图像是灰度图像,读到内存中仍然有三通道,每个通道拥有相同数据的图..._cv::imwrite

一天,我用100行代码撸了一个表白神器!喜欢拿走~_公众号-芋道源码的博客-程序员宅基地

5月21日,“程序员用代码花式表白”顶上热搜,某广场的大屏,出现了程序员用Java语言,拼成了薇娅头像进行表白,网友不禁发出感叹:这样的程序员还缺女朋友吗?看到这儿,你以为学习Java,除...