1、下载kkFileView-4.2.1并启动(双击bin\startup.bat)
2、上传文件
public R add(UserInSession uis, MultipartFile file) throws IOException { if (file == null) { return R.fail("上传的文件为空"); } long size = file.getSize(); if (size > 100 * 1024 * 1024) { return R.fail("文件大小不能超过 100M"); } String fn = file.getOriginalFilename(); String extension = FileUtil.extName(fn); if (StrUtil.isBlank(extension)) { return R.fail("文件扩展名不能为空"); } extension = extension.trim(); if (extension.length() > 10) { return R.fail("文件扩展名长度不能超过 10"); } String fileNameClient = fn.substring(0, fn.length() - extension.length() - 1); if (StrUtil.isBlank(fileNameClient)) { return R.fail("文件名不能为空"); } fileNameClient = fileNameClient.trim(); if (fileNameClient.length() > 64) { return R.fail("文件名长度不能超过 64"); } String fileNameServer = IdUtil.simpleUUID().toLowerCase(); File f = new File(); f.setUuid(IdUtil.simpleUUID().toLowerCase()); f.setFileNameServer(fileNameServer);//存储在数据库中的文件名字,也是存在磁盘中的文件名字 f.setFileNameClient(fileNameClient); f.setExtension(extension.toLowerCase()); f.setSize(size); f.setUploadDt(LocalDateTime.now()); f.setUploadUserId(uis.getId()); f.setUploadUserName(uis.getName()); f.setIsShare(false); f.setIsShareWithPsw(false); f.setSharePsw(null); fileMapper.insert(f); // 保存文件 C:\_ai_platform\file_upload\a4e170b7a4924092b16a6d6b610f427c.png String dest = ConfigService.getValue("file_save_path") + "\\" + fileNameServer + "." + extension; // cn.hutool.core.io.FileUtil FileUtil.writeFromStream(file.getInputStream(), dest); return R.succTip(); }
3、文件预览
public R preview(Long userId, Long id, String sharePsw) { File f = fileMapper.selectById(id); if (f == null) { return R.fail("文件不存在"); } // 不是自己的文件、未分享 if (!f.getUploadUserId().equals(userId) && !f.getIsShare()) { return R.fail("该文件尚未被分享"); } // 不是自己的文件、分享了、有分享密码、但密码不一致 if (!f.getUploadUserId().equals(userId) && f.getIsShareWithPsw() && !f.getSharePsw().equals(sharePsw)) { return R.fail("分享密码错误"); } return R.succ().attach(f.getFileNameServer() + "." + f.getExtension()); }
前端:
function onPreview(row: any) { if (row.uploadUserId != uis.value.id && row.isShareWithPsw) { dialogPreview.value.open(row) } else { api.post('file/preview', { id: row.id }).then((attach: any) => { preview(uis.value.filePreviewServiceUrl, attach, true) }) } } const preview = (filePreviewServiceUrl, fileName, isNewWindow) => { debugger //http://localhost:9000/ai-platform-file-upload/a4e170b7a4924092b16a6d6b610f427c.png const url = 'http://' + window.location.hostname + ':9000/ai-platform-file-upload/' + fileName window.open( // filePreviewServiceUrl: "http://127.0.0.1:8012/onlinePreview" filePreviewServiceUrl + '?url=' + encodeURIComponent(Base64.encode(url)), isNewWindow ? '_blank' : '_self' ) }
4、文件删除
public R delete(Long userId, Long id) { File f = fileMapper.selectById(id); if (f == null || !f.getUploadUserId().equals(userId)) { return R.fail("文件不存在或该文件是由他人上传的"); } fileMapper.deleteById(f); // 删除文件 String fn = f.getFileNameServer() + "." + f.getExtension(); // C:\_ai_platform\file_upload\a4e170b7a4924092b16a6d6b610f427c.png FileUtil.del(ConfigService.getValue("file_save_path") + "\\" + fn); return R.succTip(); }
5、文件列表
public R list(Long userId, Integer type, String sort, Boolean desc, Integer page, Integer pageSize, String condition) { IPage<File> files = fileMapper.list(new Page<>(page, pageSize), userId, type, condition, SqlUtil.orderBy(sort, desc)); // 脱敏 for (File f : files.getRecords()) { f.setFileNameServer(null); f.setSharePsw(null); } return R.succ().attach(files); }