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
ランキング