文件上传-SpringBoot

IO流回顾:

  1.输入流input:读取外部数据(硬盘、光盘等储存设备的数据)到内存(也就是程序)中;

  2.输出output:将程序(内存)的数据输出到硬盘等储存设备中;

其实文件下载和上传可以这样理解:上传:从本地上传到网络,只需要一步;

而下载,首先得从网络上下载(也就是从外部数据:硬盘..上下载到内存,利用输入流InputStream),然后再保存到本地(意思就是保存到本地这个硬盘上,利用输出流OutputStream),这是两步;

文件下载:

  思路:1、设置路径,若文件存在,响应头设置contentType("application/force-download")设置强制下载。addHeader("Content-Disposition","attachment","fileName"+文件名)设置文件名作为请求头;

2、然后定义输入输出流,输出流负责将程序中的数据(也就是网页中拥有的数据)输出到硬盘中,输入流负责将硬盘也就是外部储存的文件进行读取:

/**
 * @param path     想要下载的文件的路径
 * @param response
 * @功能描述 下载文件:
 */
@RequestMapping("/download")
public void download(String path, HttpServletResponse response) {
    try {
        // path是指想要下载的文件的路径
        File file = new File(path);
        log.info(file.getPath());
        // 获取文件名
        String filename = file.getName();
        // 获取文件后缀名
        String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
        log.info("文件后缀名:" + ext);

        // 将文件写入输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStream fis = new BufferedInputStream(fileInputStream);
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();

        // 清空response
        response.reset();
        // 设置response的Header
        response.setCharacterEncoding("UTF-8");
        //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
        //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
        // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        // 告知浏览器文件的大小
        response.addHeader("Content-Length", "" + file.length());
        OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
        response.setContentType("application/octet-stream");
        outputStream.write(buffer);
        outputStream.flush();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

第二种方法-文件上传:

 1.首先来看MultipartAutoConfiguration自动配置类中绑定配置属性的类:

@ConfigurationProperties(
    prefix = "spring.servlet.multipart",
    ignoreUnknownFields = false
)
public class MultipartProperties {
    private boolean enabled = true;
    private String location;
    private DataSize maxFileSize = DataSize.ofMegabytes(1L);
    private DataSize maxRequestSize = DataSize.ofMegabytes(10L);
    private DataSize fileSizeThreshold = DataSize.ofBytes(0L);
    private boolean resolveLazily = false;

    public MultipartProperties() {
    }

2.然后我们可以在application.properties中对文件上传的一些配置进行自定义设置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
spring.servlet.multipart.enabled=true

3.然后我们写控制器,利用控制器来完成文件上传操作(当用户在客户端请求文件上传时,控制器对此进行处理)

@Controller
@Slf4j
public class PracticeController {
    @PostMapping("/upload1")
    public String upload(@RequestParam("email")String email,
                         @RequestParam("username") String username,
                         @RequestPart("headerImg") MultipartFile headerImg,
                         @RequestPart("photos") MultipartFile[] photos) throws IOException {
//提示信息
        System.out.println("单文件上传信息为:"+headerImg.getOriginalFilename());
        System.out.println("多文件上传个数为:"+photos.length);
        for (MultipartFile photo : photos) {
            System.out.println("多文件信息为:"+photo.getOriginalFilename()+",文件大小:"+photo.getSize()/1000+"kb");
        }
//        将文件上传到指定文件夹,利用transferTo():复制到
        if(!headerImg.isEmpty()){
            //得到文件名字
            String filename = headerImg.getOriginalFilename();
            headerImg.transferTo(new File("E:\\"+filename));
        }
        
//        多文件
        if(photos.length>0){
            for (MultipartFile photo : photos) {
                //将每个文件一一上传
                photo.transferTo(new File("E:\\"+photo.getOriginalFilename()));
            }
        }
       return "成功";
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现文件上传去重可以考虑以下步骤: 1. 在文件上传时,获取文件的MD5值(或其他唯一标识符),并存储到数据库中。 2. 在上传新文件时,先计算文件的MD5值,然后查询数据库中是否已存在该MD5值的记录。 3. 如果存在,则表示文件已存在,不需要再次上传;如果不存在,则可以执行上传操作,同时将MD5值存储到数据库中。 以下是一个示例代码: ```java @Service public class FileService { @Autowired private FileRepository fileRepository; // 上传文件 public void uploadFile(MultipartFile file) throws IOException { String md5 = DigestUtils.md5Hex(file.getInputStream()); // 计算文件MD5值 if (fileRepository.findByMd5(md5) != null) { throw new RuntimeException("文件已存在,不需要再次上传!"); } // 执行上传操作,保存文件到服务器 // ... // 保存文件MD5值到数据库 FileEntity fileEntity = new FileEntity(); fileEntity.setName(file.getOriginalFilename()); fileEntity.setMd5(md5); fileRepository.save(fileEntity); } } @Entity public class FileEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String md5; // getter/setter方法 } @Repository public interface FileRepository extends JpaRepository<FileEntity, Long> { FileEntity findByMd5(String md5); } ``` 在上述示例代码中,通过使用Spring Data JPA实现了文件上传去重功能。在上传文件时,先计算文件的MD5值,然后查询数据库中是否已存在该MD5值的记录。如果存在,则表示文件已存在,不需要再次上传;如果不存在,则可以执行上传操作,同时将MD5值存储到数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fairy要carry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值