文件下载¶
文件下载按钮下载附件示例代码。
完整脚本¶
(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文件并提供下载。主要流程包括:获取附件列表、复制文件到临时目录、压缩文件、清理临时文件、返回下载路径。
脚本功能¶
- 获取附件列表: 从文件上传控件获取附件JSON字符串并解析
- 创建临时目录: 创建用于存放复制文件和压缩文件的目录
- 复制文件: 将附件文件复制到临时目录,处理重名文件
- 压缩文件: 将所有文件压缩成ZIP文件
- 清理临时文件: 删除复制到临时目录的文件
- 返回下载路径: 返回ZIP文件的下载路径
使用场景¶
- 批量下载表单附件
- 将多个附件打包下载
- 文件导出功能
- 附件归档下载
关键步骤说明¶
1. 获取附件列表¶
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. 压缩文件¶
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文件会保留
- 大量文件压缩可能耗时较长,注意超时设置
- 确保有足够的磁盘空间
常见应用¶
- 批量下载: 批量下载表单中的多个附件
- 文件归档: 将相关文件打包归档
- 数据导出: 导出表单附件数据
- 文件备份: 备份表单附件文件
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f6fc15tn6i28
文档更新时间: 2024-01-05 05:43 作者:john