package com.heai.modules.ftp.controller; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import com.heai.common.exception.RRException; import com.heai.common.utils.ConfigConstant; import com.heai.common.utils.PageUtils; import com.heai.common.utils.R; import com.heai.common.utils.RandomUtil; import com.heai.modules.ftp.util.FTPUtils; import com.heai.modules.oss.entity.SysOssEntity; import com.heai.modules.oss.service.SysOssService; import com.heai.modules.sys.controller.AbstractController; import com.heai.modules.sys.entity.SysUserEntity; import com.heai.modules.sys.service.SysConfigService; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.ClassUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Date; import java.util.Map; /** * 文件上传 * * */ @Slf4j @RestController @RequestMapping("ftp/file") public class SysFtpController extends AbstractController { @Autowired private SysOssService sysOssService; @Autowired private SysConfigService sysConfigService; private final static String KEY = ConfigConstant.CLOUD_STORAGE_CONFIG_KEY; /** * 列表 */ @GetMapping("/list") public R list(@RequestParam Map params){ PageUtils page = sysOssService.queryPage(params); return R.ok().put("page", page); } /** * 上传文件 */ @PostMapping("/upload") public R upload(@RequestParam("file") MultipartFile file) throws Exception { if (file.isEmpty()) { throw new RRException("上传文件不能为空"); } R r = new R(); //保存文件信息 SysOssEntity ossEntity = new SysOssEntity(); SysUserEntity user = getUser(); // 文件名 String fileName = file.getOriginalFilename(); // 文件类型 String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1); String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); // MultipartFile 转化 file File newFile = FTPUtils.multipartFileToFile(file,fileName); String newFileName = RandomUtil.getOrderNoByAtomic1(fileType)+suffix; // 上传路径 String path = user.getUsername()+"/"+ DateUtil.format(new Date(),"yyyy-MM-dd"); // ftp上传 注意文件编码格式 boolean uploadStatus = FTPUtils.ftpUpload(path, newFileName, newFile); ossEntity.setFileName(file.getOriginalFilename()); ossEntity.setNewFileName(newFileName); ossEntity.setUrl(path); ossEntity.setFileType(fileType); ossEntity.setCreateDate(DateUtil.date()); ossEntity.setCreatedBy(user.getUsername()); ossEntity.setFileSuffix(suffix); sysOssService.save(ossEntity); newFile.delete(); return uploadStatus?R.ok().put("ossEntity", ossEntity):R.error("上附件失败"); } /** * 删除 */ @PostMapping("/delete") @RequiresPermissions("sys:oss:all") public R delete(@RequestBody Long[] ids){ sysOssService.removeByIds(Arrays.asList(ids)); return R.ok(); } /** * @Method multipartFileToFile * @Description: MultipartFile 转 File * @author zuowenwen * @Version 1.0 * @param file * @return java.io.File * @throws * @date 2020/12/17 */ public static File multipartFileToFile(MultipartFile file ,String fileName) throws Exception { File toFile = null; if (file.equals("") || file.getSize() <= 0) { file = null; } else { InputStream ins = null; ins = file.getInputStream(); if(fileName != null && !"".equals(fileName)){ toFile = new File(fileName); }else{ toFile = new File(file.getOriginalFilename()); } inputStreamToFile(ins, toFile); ins.close(); } return toFile; } //获取流文件 private static void inputStreamToFile(InputStream ins, File file) { try { OutputStream os = new FileOutputStream(file); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); ins.close(); } catch (Exception e) { e.printStackTrace(); } } /** * @Method downFtpFile * @Description: ftp 文件流下载 (返回给前端一个文件流) * @author sxm * @Version 1.0 * @param id * @return java.io.File * @throws * @date 2020/12/17 */ @GetMapping("/downFtpFile/{id}") public void downFtpFile(@PathVariable("id") Long id, HttpServletResponse response){ // SysOssEntity resultData =sysOssService.getById(id); // String path = System.getProperty("user.dir"); // File file = new File(path+"/"+resultData.getFileName()); // FTPUtils.ftpDownload(resultData.getUrl(),resultData.getFileName(),file); // HttpHeaders headers = new HttpHeaders(); // headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); // headers.add("Content-Disposition", "attachment; filename=" + file.getName()); // headers.add("Pragma", "no-cache"); // headers.add("Expires", "0"); // headers.add("Last-Modified", new Date().toString()); // headers.add("ETag", String.valueOf(System.currentTimeMillis())); // return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file)); // //FTPUtils.downFile(response,"",resultData.getNewFileName(),resultData.getFileName()); SysOssEntity resultData =sysOssService.getById(id); FTPUtils.downFile(response,resultData.getUrl(),resultData.getNewFileName(),resultData.getFileName()); } }