SpringBoot之文件上传、下载及文件夹映射

文件上传及下载:

控制器或服务层方法
public class FileUpload {

    @Value("${filePath}")

    //文件路径夹
    private String filePath;

    @ApiOperation("单上传文件")
    @PostMapping("/upload")
    public Object singleFileUpload(MultipartFile file, HttpServletRequest request) throws IOException {
        String fileName = file.getOriginalFilename();
        File fileDir = new File(filePath);
        if(!fileDir.exists()){
            fileDir.mkdir();
        }
        fileDir.getAbsolutePath();
        file.transferTo(new File(fileDir.getAbsolutePath(),fileName));
        return request.getRequestURI() + fileName;
    }

    @PostMapping("/multiFileUpload")
    public Object multiFileUpload(MultipartFile[] files,HttpServletRequest request){
        StringBuilder builder = new StringBuilder();
        for (MultipartFile file : files){
            String fileName = file.getOriginalFilename();
            File fileDir = new File(filePath);
            if(!fileDir.exists()){
                fileDir.mkdir();
            }
            fileDir.getAbsolutePath();
            try {
                file.transferTo(new File(fileDir.getAbsolutePath(),fileName));
            } catch (IOException e) {
                continue;
            }
            builder.append(request.getRequestURI() + fileName + ",");
        }

        if(builder.length()>1){
            builder = builder.deleteCharAt(builder.length()-1);
        }
        return builder;
    }

    @RequestMapping("/download")
    public Object contactTemp(HttpServletRequest request, HttpServletResponse response,String fileName) throws Exception{
        String temp = tempPath + fileName;
        logger.info(temp);
        File file = new File(temp);
        if (file.exists()) {
            response.setContentType("application/force-download");// 设置强制下载不打开
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String("contact.xls".getBytes("UTF-8"),"iso-8859-1"));
            response.setHeader("Content-Type", "application/octet-stream");
            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);
                }
                return "下载成功";
            } 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 "下载失败";
    }
}

文件夹映射:

@Configuration
public class FileUrl extends WebMvcConfigurerAdapter {

    @Value("${filePath}")
    private String filePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //和页面有关的静态目录都放在项目的static目录下
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //上传的图片在D盘下的目录下,访问路径如:http://localhost:8080/d3cf0281-bb7f-40e0-ab77-406db95ccf2c.jpg
        //其中addResourceHandler中表示访问的前缀。addResourceLocations中是文件真实的存储路径
        System.out.println(filePath);
        registry.addResourceHandler("/**").addResourceLocations("file:" + filePath);

        //允许swagger访问静态页面
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
    }
}

docker部署时需进行文件夹映射,多文件夹映射命令:

docker run -p 16888:16888 -v /root/config:/config -v /root/config/temp:/root/config/temp -v /home/fdfs/storage/data:/home/fdfs/storage/data --name app app:0.0.1-SNAPSHOT 

-v 操作为文件夹映射


注:文件下载时如果可以通过浏览器直接下载而不是解析后加载的可以直接使用

window.location.href="接口地址"

进行外部资源调用。

注:文件映射时会影响static下的html、swagger-ui.html等静态资源访问,如果出现问题请将配置更改为:

registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").addResourceLocations("classpath:/resources/").addResourceLocations("classpath:/static/").addResourceLocations("classpath:/public/").addResourceLocations("file:" + filePath);

即可解决以上所述问题

文件上传html代码:

写法一:直接form表单提交

<form enctype="multipart/form-data" action="/upload" method="POST">
    <input id="file" type="file"/>
    <button id="uploadimg" type="button">uploadimg</button>
</form>

写法而:通过ajax进行form表单提交

var formData = new FormData();

//单文件,多文件时此处应用for玄幻
formData.append("file", document.getElementById("file").files[0]);

                    $.ajax({
                        url: "/upload",
                        type: "POST",
                        data: formData,
                        /**
                         *必须false才会自动加上正确的Content-Type
                         */
                        contentType: false,
                        /**
                         * 必须false才会避开jQuery对 formdata 的默认处理
                         * XMLHttpRequest会对 formdata 进行正确的处理
                         */
                        processData: false,
                        success: function (data) {
                            if (data) {
                                layer.msg("上传成功!");
                            }
                        }
                    });

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中,实现文件上传下载可以通过以下步骤完成: 1. 文件上传: - 前端使用HTML的`input`元素标签选择文件,并通过Ajax技术将文件发送到后端。 - 后端接收到文件后,可以使用`MultipartFile`类型的参数来接收文件数据,并将文件保存到服务器的指定位置。 2. 文件下载: - 在后端,定义一个接口,用于处理文件下载请求。可以使用`@GetMapping`或`@RequestMapping`注解来映射URL路径。 - 在处理文件下载请求的方法中,可以使用`ResponseEntity`类型作为返回值,并设置响应头信息,指定文件的Content-Type和Content-Disposition。 - 通过`InputStreamResource`将文件内容以流的形式返回给客户端。 引用中提供了一个示例代码,展示了如何在Spring Boot中实现文件上传和数据库表的建立。这段代码包含了文件的ID、文件名和文件URL等信息。你可以参考这个示例来实现文件上传功能。 引用中也提供了一个具体的示例,展示了如何在Spring Boot和Vue中实现文件上传下载功能。这个示例使用了axios库来发送文件上传请求,并通过后端的API来处理文件上传下载。你可以参考这个示例来实现文件上传下载功能。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [SpringBoot文件上传下载](https://download.csdn.net/download/weixin_47973026/12873692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [springboot+vue实现文件上传下载](https://download.csdn.net/download/weixin_38742954/14663881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值