跳转至

文件下载

文件下载按钮下载附件示例代码。

完整脚本

(function() {
    var ZipUtil = new Packages.cn.myapps.util.file.ZipUtil();
    var FileUtil = new Packages.cn.myapps.util.file.FileUtil();
    var JSONArray = new Packages.net.sf.json.JSONArray();
    //文件上传控件值
    var fileString = getItemValueAsString("图片");
    var fileArr = JSONArray.fromObject(fileString);
    var rootPath = new Packages.cn.myapps.util.property.PropertyUtil().getPath();   //4.4使用
    var rootPath = new Packages.cn.myapps.common.util.PropertyUtil().getPath();     // 5.0使用
    var rootPath = Packages.cn.myapps.common.Environment.getInstance().getStorageRootPath() ;    //5.1使用
    //压缩文件集合
    var files = [];
    //压缩文件目录
    var destFolder = rootPath + "/uploads/zipFile";
    //复制文件目录
    var copyFolder = destFolder + "/copyFile";
    var folders = new Packages.java.io.File(copyFolder);
    if(!folders.exists()){
        folders.mkdirs();
    }
    //重名记录次数
    var index = 1;
    for (var iterator = fileArr.iterator(); iterator.hasNext();) {
        var file = iterator.next();
        var path = rootPath + file.getString("path");
        var name = file.getString("name");
        var fileType = name.substring(name.lastIndexOf("."));
        //复制的文件路径(把id文件名转成对应的文件名)
        var newPath = copyFolder + "/" + name;
        if (new Packages.java.io.File(newPath).exists()) {
            newPath = copyFolder + "/" + name.replace(fileType, index + fileType);
            index++;
        }
        FileUtil.copyFile(newPath, path);
        files.push(newPath);
    }
    //压缩文件名
    var zipName = "testzip";
    ZipUtil.compressFiles(zipName, files, destFolder);
    //删除复制的文件
    var FileUtil = new Packages.cn.myapps.util.file.FileUtil();
    for (var i = 0; i < files.length; i++) {
        FileUtil.deleteFiles(files[i]);
    }
    //文件下载路径
    var downloacUrl = "/uploads/zipFile/" + zipName + ".zip";
    return downloacUrl;
})()

脚本说明

该脚本用于将表单附件字段中的多个文件打包成ZIP文件并提供下载。主要流程包括:获取附件列表、复制文件到临时目录、压缩文件、清理临时文件、返回下载路径。

脚本功能

  1. 获取附件列表: 从文件上传控件获取附件JSON字符串并解析
  2. 创建临时目录: 创建用于存放复制文件和压缩文件的目录
  3. 复制文件: 将附件文件复制到临时目录,处理重名文件
  4. 压缩文件: 将所有文件压缩成ZIP文件
  5. 清理临时文件: 删除复制到临时目录的文件
  6. 返回下载路径: 返回ZIP文件的下载路径

使用场景

  • 批量下载表单附件
  • 将多个附件打包下载
  • 文件导出功能
  • 附件归档下载

关键步骤说明

1. 获取附件列表

var fileString = getItemValueAsString("图片");
var fileArr = JSONArray.fromObject(fileString);

2. 获取根路径(根据版本选择)

// 4.4版本
var rootPath = new Packages.cn.myapps.util.property.PropertyUtil().getPath();

// 5.0版本
var rootPath = new Packages.cn.myapps.common.util.PropertyUtil().getPath();

// 5.1版本
var rootPath = Packages.cn.myapps.common.Environment.getInstance().getStorageRootPath();

3. 创建临时目录

var destFolder = rootPath + "/uploads/zipFile";
var copyFolder = destFolder + "/copyFile";
var folders = new Packages.java.io.File(copyFolder);
if(!folders.exists()){
    folders.mkdirs();
}

4. 复制文件并处理重名

for (var iterator = fileArr.iterator(); iterator.hasNext();) {
    var file = iterator.next();
    var path = rootPath + file.getString("path");
    var name = file.getString("name");
    // 复制文件...
}

5. 压缩文件

ZipUtil.compressFiles(zipName, files, destFolder);

6. 清理并返回路径

// 删除临时文件
// 返回下载路径

扩展示例

示例1:简化版文件下载

(function() {
    var ZipUtil = new Packages.cn.myapps.util.file.ZipUtil();
    var FileUtil = new Packages.cn.myapps.util.file.FileUtil();
    var JSONArray = new Packages.net.sf.json.JSONArray();

    var fileString = getItemValueAsString("附件");
    if(fileString == null || fileString.trim().length == 0){
        return "没有附件可下载";
    }

    var fileArr = JSONArray.fromObject(fileString);
    var rootPath = Packages.cn.myapps.common.Environment.getInstance().getStorageRootPath();
    var destFolder = rootPath + "/uploads/zipFile";
    var files = [];

    // 创建目录
    var folders = new Packages.java.io.File(destFolder);
    if(!folders.exists()){
        folders.mkdirs();
    }

    // 复制文件
    for (var iterator = fileArr.iterator(); iterator.hasNext();) {
        var file = iterator.next();
        var path = rootPath + file.getString("path");
        var name = file.getString("name");
        var newPath = destFolder + "/" + name;
        FileUtil.copyFile(newPath, path);
        files.push(newPath);
    }

    // 压缩文件
    var zipName = "附件_" + format(new Date(), "yyyyMMddHHmmss");
    ZipUtil.compressFiles(zipName, files, destFolder);

    // 删除临时文件
    for (var i = 0; i < files.length; i++) {
        FileUtil.deleteFiles(files[i]);
    }

    return "/uploads/zipFile/" + zipName + ".zip";
})();

示例2:根据文档名称命名ZIP文件

(function() {
    var doc = getCurrentDocument();
    var docName = doc.getItemValueAsString("文档名称");
    var zipName = docName != null ? docName : "附件";

    // ... 其他代码 ...

    ZipUtil.compressFiles(zipName, files, destFolder);
    return "/uploads/zipFile/" + zipName + ".zip";
})();

示例3:下载单个文件(不压缩)

(function() {
    var fileString = getItemValueAsString("附件");
    if(fileString == null || fileString.trim().length == 0){
        return "没有附件";
    }

    var JSONArray = new Packages.net.sf.json.JSONArray();
    var fileArr = JSONArray.fromObject(fileString);

    if(fileArr.size() > 0){
        var file = fileArr.getJSONObject(0);
        var path = file.getString("path");
        return path;  // 直接返回文件路径
    }

    return "没有附件";
})();

示例4:过滤特定类型文件

(function() {
    // ... 前面的代码 ...

    var allowedTypes = [".pdf", ".doc", ".docx", ".xls", ".xlsx"];

    for (var iterator = fileArr.iterator(); iterator.hasNext();) {
        var file = iterator.next();
        var name = file.getString("name");
        var fileType = name.substring(name.lastIndexOf(".")).toLowerCase();

        // 只处理允许的文件类型
        if(allowedTypes.indexOf(fileType) >= 0){
            // 复制文件...
        }
    }

    // ... 后面的代码 ...
})();

关键函数说明

  • getItemValueAsString("字段名"): 获取文件上传控件的JSON字符串值
  • JSONArray.fromObject(jsonString): 将JSON字符串解析为JSONArray对象
  • PropertyUtil.getPath(): 获取系统根路径(不同版本使用不同的类)
  • Environment.getInstance().getStorageRootPath(): 获取存储根路径(5.1版本)
  • new Packages.java.io.File(path): 创建文件对象
  • file.exists(): 判断文件或目录是否存在
  • file.mkdirs(): 创建目录(包括父目录)
  • FileUtil.copyFile(dest, src): 复制文件
  • FileUtil.deleteFiles(path): 删除文件
  • ZipUtil.compressFiles(name, files, folder): 压缩文件
  • 参数1: ZIP文件名(不含扩展名)
  • 参数2: 要压缩的文件路径数组
  • 参数3: 压缩文件存放目录

文件路径说明

附件JSON格式

附件字段的值通常是JSON数组格式:

[
    {
        "id": "文件ID",
        "name": "文件名.pdf",
        "path": "/uploads/文件路径",
        "size": 1024000,
        "type": "application/pdf"
    }
]

路径获取方法

  • 文件路径: rootPath + file.getString("path")
  • 文件名: file.getString("name")
  • 文件类型: name.substring(name.lastIndexOf("."))

版本兼容性

脚本中提供了三个版本的根路径获取方法:

  • 4.4版本: new Packages.cn.myapps.util.property.PropertyUtil().getPath()
  • 5.0版本: new Packages.cn.myapps.common.util.PropertyUtil().getPath()
  • 5.1版本: Packages.cn.myapps.common.Environment.getInstance().getStorageRootPath()

根据实际使用的版本选择对应的方法。

注意事项

  • ⚠️ 版本兼容: 根据系统版本选择正确的根路径获取方法
  • ⚠️ 字段名称: getItemValueAsString("图片") 中的字段名需要与实际字段名匹配
  • ⚠️ 目录权限: 确保有创建目录和写入文件的权限
  • ⚠️ 文件路径: 文件路径必须是绝对路径
  • ⚠️ 重名处理: 脚本中已处理重名文件,会自动添加序号
  • 压缩文件名不要包含特殊字符
  • 临时文件会在压缩后删除,但ZIP文件会保留
  • 大量文件压缩可能耗时较长,注意超时设置
  • 确保有足够的磁盘空间

常见应用

  1. 批量下载: 批量下载表单中的多个附件
  2. 文件归档: 将相关文件打包归档
  3. 数据导出: 导出表单附件数据
  4. 文件备份: 备份表单附件文件

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f6fc15tn6i28
文档更新时间: 2024-01-05 05:43 作者:john