kkFileView文件预览

简介: kkFileView文件预览

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);
    }

具体项目参考:https://gitee.com/zhushangling/hit-ai

目录
相关文章
|
Java 数据安全/隐私保护
在线预览项目kkFileView(二)代码讲解与修改
在线预览项目kkFileView(二)代码讲解与修改
1535 0
在线预览项目kkFileView(二)代码讲解与修改
|
4月前
|
人工智能 JavaScript 机器人
保姆级教程:OpenClaw(Clawdbot)阿里云+Windows本地部署,集成钉钉 AI助手 7×24小时可用
OpenClaw(曾用名Clawdbot/Moltbot)是2026年主流开源AI智能体框架,支持私有化部署、多渠道接入与自动化任务执行。本文基于2026年最新实操流程,提供阿里云服务器部署、Windows本地部署两套方案,搭配钉钉集成完整步骤与可直接复制的代码命令,帮助用户从零完成部署与集成,实现钉钉内AI助手7×24小时可用。
2287 2
|
XML Java Maven
jar包导入到项目中、本地maven仓库、私库
jar包导入到项目中、本地maven仓库、私库
4386 0
jar包导入到项目中、本地maven仓库、私库
|
编解码 Java Linux
开源文档预览项目 kkFileView (9.9k star) ,快速入门
kkFileView 是一款文件文档在线预览解决方案,采用流行的 Spring Boot 框架构建,易于上手和部署。 该项目基本支持主流办公文档的在线预览,包括但不限于 doc、docx、xls、xlsx、ppt、pptx、pdf、txt、zip、rar,以及图片、视频、音频等格式。
开源文档预览项目 kkFileView (9.9k star) ,快速入门
|
JavaScript Java
kkFileView在线文件预览与项目集成
kkFileView在线文件预览与项目集成
1319 1
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
JSON 自然语言处理 前端开发
WebSocket调试工具深度对比:Postman与Apipost功能实测解析
本文深入对比了Postman与Apipost两款WebSocket调试工具。作为实时通讯系统工程师,作者在开发智能客服系统时遇到了传统工具调试复杂、文档管理不便的问题。通过引入Apipost的智能连接池、消息分组管理和自动化文档生成等功能,实现了多环境自动切换、消息分类和接口文档自动生成,极大提升了调试效率和团队协作效果。最终,使用Apipost使接口调试时间减少40%,文档维护成本降低70%,跨团队沟通效率提升50%。
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
2625 11