springBoot实现文件的上传和下载

该博客围绕Java Spring Boot展开,介绍了图片上传和文件接收相关知识。包括在yml文件调用常量、用MultipartFile接收文件等知识储备,阐述图片上传思路是存磁盘和写url到数据库,还提及controller层、service层操作及测试,最后讲解了文件接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识储备

1.在yml文件中调用常量,在类中引用

files:
  upload:
    path: C:\Users\86150\Desktop\项目集合\files\
    @Value("${files.upload.path}")
    private String path;

2. MultipartFile 类型用于接收文件类型

public Result upload(@RequestParam MultipartFile file)

3.StrUtil.DOT 为hutool的工具类方法翻译为“.”

4.在返回文件类型的时候,一般在参数中写下HttpServletResponse response用于返回数据

public void download( HttpServletResponse response) 

 如何上传图片?

思路:把图片放到磁盘上,如何把url写到数据库中存起来

controller层


@RestController
@RequestMapping("/files")
public class FilesController {

    //这个为磁盘的路径
    @Value("${files.upload.path}")
    private String path;

    @Resource
    private IFilesService filesService;

    //实现上传方法
    @PostMapping("/upload")
    public Result upload(@RequestParam MultipartFile file) {


        //通过调用这个方法,将文件写到磁盘中,并返回文件的url,功能在service层实现
        String url = filesService.saveDisk(file);

        //建一个实体类对象,把获取到的url,名字放到对象中
        Files files = new Files();
        files.setUrl(url);
        files.setName(file.getOriginalFilename());


        //将获取到的对象写入数据库中 
         try {
             filesService.save(files);
         }catch (Exception e){
             throw new LoginException(Constants.CODE_500,"文件写入失败");
         }
         //成功
        return Result.success();
    }




}

service层

中具体事项方法saveDisk方法

package com.example.mybatis_plus_generator.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.example.mybatis_plus_generator.entity.Files;
import com.example.mybatis_plus_generator.mapper.FilesMapper;
import com.example.mybatis_plus_generator.service.IFilesService;

@Service
public class FilesServiceImpl extends ServiceImpl<FilesMapper, Files> implements IFilesService {

    @Value("${files.upload.path}")
    private String path;

    //service层中具体完成写入磁盘功能
    public String saveDisk(MultipartFile file){

        //获取文件的原始名字和类型
        String originalFilename = file.getOriginalFilename();
        String type = FileUtil.extName(originalFilename);

        //通过hutool的工具类IdUtil生成唯一的字符串,用于识别
        String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT+type;
        //获取到传进来文件的文件位置
        File uploadFile = new File(path + fileUUID);
        //获取到传进来文件的文件夹,若不存在的话就创建一个
        File parentFile = new File(path);
        if (!parentFile.exists()){
            parentFile.mkdirs();
        }
        //将传进来的文件传到文件夹中
        try {
            file.transferTo(uploadFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //返回该文件的路径和文件名,方便调用
        return "http://localhost:8080/file/"+fileUUID;
    }
}

测试

 

如何接收文件?

    //这个为磁盘的路径
    @Value("${files.upload.path}")
    private String path;
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
        // 根据文件的唯一标识码获取文件
        File uploadFile = new File(path + fileUUID);
        // 设置输出流的格式
        ServletOutputStream os = response.getOutputStream();
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileUUID, "UTF-8"));
        response.setContentType("application/octet-stream");

        // 读取文件的字节流
        try {
            os.write(FileUtil.readBytes(uploadFile));
        } catch (Exception e) {
            System.err.println("文件下载失败,文件不存在");
        }
        os.flush();
        os.close();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值