ファイルのアップロードとダウンロードのバックエンド コード

package com.ruoyi.file.controller;

import cn.novelweb.tool.upload.local.pojo.UploadFileParam;
import com.qcloud.cos.utils.IOUtils;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.file.constant.SysConstant;
import com.ruoyi.file.domain.UploadFiles;
import com.ruoyi.file.model.response.RestResponse;
import com.ruoyi.file.service.IUploadFilesService;
import com.ruoyi.file.util.EmptyUtils;
import com.ruoyi.file.util.EncodingUtils;
import com.ruoyi.file.util.UuidUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.BindingResult;
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.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * uploadFileController
 *
 * @author 余征
 * @date 2023-03-27
 */
@RestController
@RequestMapping("/file/files")
@RequiredArgsConstructor
@Slf4j
public class UploadFilesController extends BaseController {
    
    
    @Autowired
    private IUploadFilesService uploadFilesService;
    @Value("${file.save-path:/data-center/files/file-manager}")
    private String savePath;

    @Value("${file.conf-path:/data-center/files/file-manager/conf}")
    private String confFilePath;

/**
 * 查询传输文件列表
 */
@PreAuthorize("@ss.hasPermi('file:files:list')")
@GetMapping("/list")
    public TableDataInfo list(UploadFiles uploadFiles) {
    
    
        startPage();
        List<UploadFiles> list = uploadFilesService.selectUploadFilesList(uploadFiles);
        return getDataTable(list);
    }

    /**
     * 导出传输文件列表
     */
    @PreAuthorize("@ss.hasPermi('file:files:export')")
    @Log(title = "uploadFile", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, UploadFiles uploadFiles) {
    
    
        List<UploadFiles> list = uploadFilesService.selectUploadFilesList(uploadFiles);
        ExcelUtil<UploadFiles> util = new ExcelUtil<UploadFiles>(UploadFiles. class);
        util.exportExcel(response, list, "uploadFile数据");
    }

    /**
     * 获取传输文件详细信息
     */
    @PreAuthorize("@ss.hasPermi('file:files:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Integer id) {
    
    
        return AjaxResult.success(uploadFilesService.selectUploadFilesById(id));
    }


    /**
     * 修改传输文件信息
     */
    @PreAuthorize("@ss.hasPermi('file:files:edit')")
    @Log(title = "uploadFile", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody UploadFiles uploadFiles) {
    
    
        return toAjax(uploadFilesService.updateUploadFiles(uploadFiles));
    }

    /**
     * 删除传输文件
     */
    @PreAuthorize("@ss.hasPermi('file:files:remove')")
    @Log(title = "uploadFile", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Integer[] ids) {
    
    
        return toAjax(uploadFilesService.deleteUploadFilesByIds(ids));
    }


    /**
     * 普通上传方式上传文件:用于小文件的上传,等待时间短,不会产生配置数据
     *
     * @param file 文件
     * @return {@link RestResponse}<{@link String}>
     */
    @PostMapping("/upload")
    public AjaxResult uploadFiles(MultipartFile file) {
    
    
        if (file.isEmpty()) {
    
    
            return AjaxResult.error( "文件不能为空");
        }
        String fileName = file.getOriginalFilename();
        // 文件名非空校验
        if (EmptyUtils.basicIsEmpty(fileName)) {
    
    
            return AjaxResult.error( "文件名不能为空");
        }
        // 大文件判定
        if (file.getSize() > SysConstant.MAX_SIZE) {
    
    
            return AjaxResult.error("文件过大,请使用大文件传输");
        }
        // 生成新文件名
        String suffixName = fileName.contains(".") ? fileName.substring(fileName.lastIndexOf(".")) : null;
        String newName = UuidUtils.uuid() + suffixName;
        // 重命名文件
        File newFile = new File(savePath, newName);
        // 如果该存储路径不存在则新建存储路径
        if (!newFile.getParentFile().exists()) {
    
    
            newFile.getParentFile().mkdirs();
        }
        // 文件写入
        try {
    
    
            file.transferTo(newFile);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        // 保存文件信息
        UploadFiles files = new UploadFiles();
        files.setFilePath(newName);
        files.setFileName(fileName);
        files.setSuffix(suffixName == null ? null : suffixName.substring(1));
        uploadFilesService.insertUploadFiles(files);
        return AjaxResult.success( "上传完成");
    }

    /**
     * 断点续传完成后上传文件信息进行入库操作
     *
     * @param dto           dto
     * @param bindingResult 绑定的结果
     * @return {@link RestResponse}<{@link String}>
     */
    @PostMapping("/add")
    public AjaxResult addFile(@RequestBody UploadFiles dto, BindingResult bindingResult) {
    
    
        if (bindingResult.hasErrors()) {
    
    
            return AjaxResult.error("参数错误");
        }
        return AjaxResult.success(uploadFilesService.insertUploadFiles(dto));
    }

    /**
     * 检查文件MD5(文件MD5若已存在进行秒传)
     *
     * @param md5      md5
     * @param fileName 文件名称
     * @return {@link RestResponse}<{@link Object}>
     */
    @GetMapping(value = "/check-file")
    public AjaxResult checkFileMd5(String md5, String fileName) {
    
    
        return AjaxResult.success(uploadFilesService.checkFileMd5(md5, fileName));
    }

    /**
     * 断点续传方式上传文件:用于大文件上传
     *
     * @param param   参数
     * @param request 请求
     * @return {@link RestResponse}<{@link Object}>
     */
    @PostMapping(value = "/breakpoint-upload", consumes = "multipart/*", headers = "content-type=multipart/form-data", produces = "application/json;charset=UTF-8")
    public AjaxResult breakpointResumeUpload(UploadFileParam param, HttpServletRequest request) {
    
    
        return AjaxResult.success(uploadFilesService.breakpointResumeUpload(param, request));
    }

    /**
     * 文件下载
     *
     * @param id       id
     * @param isSource 是否使用原文件名
     * @param request  请求
     * @param response 响应
     */
    @GetMapping(value = "/download/{id}")
    public void viewFilesImage(@PathVariable Integer id, @RequestParam(required = false) Boolean isSource, HttpServletRequest request, HttpServletResponse response) {
    
    
        OutputStream outputStream = null;
        InputStream inputStream = null;
        try {
    
    
            UploadFiles fileDetails = uploadFilesService.getFileDetails(id);
            String filename = (!EmptyUtils.basicIsEmpty(isSource) && isSource) ? fileDetails.getFileName() : fileDetails.getFilePath();
            inputStream = uploadFilesService.getFileInputStream(id);
            response.setHeader("Content-Disposition", "attachment;filename=" + EncodingUtils.convertToFileName(request, filename));
            // 获取输出流
            outputStream = response.getOutputStream();
            IOUtils.copy(inputStream, outputStream);
        } catch (IOException e) {
    
    
            log.error("文件下载出错", e);
        } finally {
    
    
            try {
    
    
                if (inputStream != null) {
    
    
                    inputStream.close();
                }
                if (outputStream != null) {
    
    
                    outputStream.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

おすすめ

転載: blog.csdn.net/m0_56095048/article/details/129819644