Skip to content

附件

说明

说明项内容
分类控件类
存储类型TableAttachment
是否可排序
是否支持过滤

设置项

设置项说明
允许不填写设置该字段是否必填
允许上传多个文件开启后将支持上传多个附件,更改后会更改字段的存储类型
不允许上传重复文件开启后将根据文件内容的md5进行重复校验,阻止上传重复的文件
允许文件公开访问默认情况下,附件文件的访问会校验当前访问的用户信息。如果不需要校验,可开启此项
不允许下载文件隐藏文件下载入口
满足以下条件时允许查看使用表达式调用上下文变量控制附件是否允许查看
满足以下条件式时允许下载使用表达式调用上下文变量控制附件是否允许下载
满足以下条件式时允许编辑使用表达式调用上下文变量控制附件是否允许编辑
展示方式设置该字段的展示方式
选项:卡片列表
允许在线编辑Word/Excel/PPT文件开启后将允许在线编辑附件中的Word、Excel和PPT文件
附件数量限制可设置该字段可上传附件数量,限制范围为:1~100
附件大小限制可设置上传附件的文件大小,限制范围为:0~200MB,限制范围上限可通过系统后台配置进行修改
只接受以下类型可通过设定文件后缀的方式,设置上传文件的格式
只允许使用系统相机上传(仅在移动端生效)开启后将只允许通过手机拍照的形式上传附件,仅在移动端生效
上传后调用自动化文件上传后,对文件进行处理或拦截文件上传
上传后自动在图片添加图片水印开启后将自动对上传的图片添加图片作为水印
配置内容:图片水印图片水印位置图片水印旋转角度图片水印透明度
上传后自动在图片添加文字水印开启后将自动对上传的图片添加动态文字作为水印
配置内容:文字水印文字水印位置文字水印旋转角度文字水印大小图片水印透明度文字颜色

注意事项

  • 允许上传多个文件 因为单个附件和多个附件的存储类型不同,所以在开启/关闭允许上传多个文件时会丢失部分历史数据,需谨慎操作。

  • 只接受以下类型

    • 支持的文件类型可使用文件后缀.jpg.pdf.doc等;或使用mime-typ限定,如audio/*image/*等。 更多可参考
  • 当附件字段所在的数据表是依赖其他应用的表,则只能通过附件ID方式拼接附件的链接访问。应用ID为本应用ID,数据表ID或标识符为当前表的信息

  • 如果附件字段的文字水印中包含中文字符,请确保您的系统中已经安装了宋体字体。这是因为宋体字体能够正确显示中文字符。

在数据库中的存储格式

字段类型说明
jsonb存储JSON格式数据,JSON数据结构见下方

在数据表中,附件字段数据会存储为json格式,如果是多选,会存储为json数组。json结构如下:

ts
interface TableAttachment {
	name:string;//名称
	size:number;//大小
	id:string;//ID
	thumbnail:string;//略缩图
	path:string;//路径
	md5:string;//MD5值
}

文件的存储方式

附件上传后会使用共享存储服务保存,织信会跟根据应用、数据表、字段为不同的字段创建文件夹。文件夹的名称规则如下

companyId/appId/tableId/fieldId
  • companyId 团队ID
  • appId 应用ID
  • tableId 数据表ID
  • fieldId 字段ID

注意

以上ID都是系统内部生成的ID,不是标识符

如果上传的文件类型是图片(.png、.jpg、.jpeg、.bmp),会自动生成200*200像素的缩略图,缩略图的格式是jpg,缩略图会和附件存储在同一个文件夹下。

访问路径

附件的访问路径规则如下,如果文件没有开启允许公开访问,则需要传递用户token

通过附件path访问

text
https://host:port/web${cluster}/file/field/${appId}/${path}?token=${token}

通过附件ID访问

text
https://host:port/web${cluster}/file/field/${appId}/${tableId}/${fieldId}/${fileId}?token=${token}

通过模块、字段标记符和附件ID访问

text
https://host:port/web${cluster}/file/fieldkey/${appId}/${tableKey}/${fieldKey}/${fileId}?token=${token}

上传后调用自动化

在一些场景下,我们需要对用户上传后的文件进行处理。比如自定义型的图片压缩水印、文件加密、文件格式自定义拦截等。

上传后调用自动化

配置的自动化,将在用户上传完文件后,服务端将进行同步调用;这意味着,在调用的自动化中如果出现报错,则整个用户上传动作将失败。

以下是一个利用自动化将上传的图片转化为灰度图片的例子

js
function toGray(imageUrl){
    //利用Java将图片转化为灰度图片
    var ImageIO = Java.type('javax.imageio.ImageIO');
    var Color = Java.type('java.awt.Color');
    var URL = Java.type('java.net.URL');
    var BufferedImage = Java.type('java.awt.image.BufferedImage');
    var ByteArrayInputStream = Java.type('java.io.ByteArrayInputStream');
    var ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream');
    let url = new URL(imageUrl);
    let img = ImageIO.read(url);
    let w = img.getWidth(), h = img.getHeight();
    //创建新的灰度图片画板
    let gray = new BufferedImage(w, h, img.getType());
    let g2d = gray.createGraphics();
    g2d.setColor(null);
    g2d.fillRect(0, 0, w, h);
    for (let x = 0; x < w; x++) {
        for (let y = 0; y<h; y++) {
            // 针对像素点的颜色灰度化之后,重新绘制
            let color = img.getRGB(x, y);
            let red=(color & 0xff0000) >> 16;
            let green=(color & 0xff00) >> 8;
            let blue=color & 0x0000ff;
            let avg = Math.round((red * 0.299 + green * 0.587 + blue * 0.114));
            let grayColor=new Color(avg, avg, avg);
            g2d.setColor(grayColor);
            g2d.fillRect(x, y, 1, 1);
        }
    }
    g2d.dispose();
    //
     //替换掉共享存储中的文件
    let os = new ByteArrayOutputStream(); 
    ImageIO.write(gray, "jpg", os);
    let is = new ByteArrayInputStream(os.toByteArray());
    return is;
}
let ctx=automatic.getVar('ctx')
let imageUrl = informat.Misc.attachmentURL('attachmentTable','callAutomatic',ctx.attachment.id);
//
informat.storage.uploadStream(toGray(imageUrl),ctx.attachment.path);
//处理缩略图
let thumbnailPath=ctx.attachment.path.replace(/[^\/]+$/, ctx.attachment.thumbnail);
informat.storage.uploadStream(toGray(imageUrl),thumbnailPath);

通过自动化上传附件

以下是一个利用自动化将上传附件的例子.在这个例子中我们首先利用显示自定义表单步骤,展示一个包含附件字段的自定义表单。用户通过这个表单上传附件,再使用下面的代码片段将上传的附件移动到数据表附件字段的共享存储目录下,然后通过更新数据表的脚本将移动后的附件数据结构保存下来。

js
let record=automatic.getVar('record');
let recordId=automatic.getVar('recordId');
let att=informat.table.moveAttachment(
    '$Automatic_gai8xrg1dp62k_u6crrim3cfgo', //自定义表单标识符
    'attachment', //自定义表单附件字段
    'attachmentTable', //目标数据表标识符
    'fromAutomaticAttachment',//目标数据表附件字段
    record.attachment);
informat.table.update('attachmentTable',{
    id:recordId,
    fromAutomaticAttachment:att
})

批量下载

以下是一个利用自动化将上传多个附件打包成zip文件,批量下载的例子

js
let recordId=automatic.getVar('recordId')
let record=informat.table.queryById('attachmentTable',recordId);
let downloadAttachments=record.downloadAttachment;
if(downloadAttachments==null||downloadAttachments.length==0){
    informat.app.abort('请先上传文件')
}
downloadAttachments.forEach(item=>{
    informat.storage.download(item.path, 'automatic_download/'+item.name);
})
informat.file.zip('automatic_download','automatic_download.zip');

在线预览编辑

织信使用第三方文档预览服务支持文档的预览和编辑功能。 在用户打开office系列文件(Word、Excel、PPT)文件时会采用预览服务显示。 在用户打开pdf、图片、音频、视频文件时采用系统内建的预览服务展示。

展示效果

自定义共享存储

默认情况下,附件字段使用json格式存储上传文件的元数据,其中包含文件的名称、md5、在共享存储中得路径等信息。如果需要在不同的字段之间移动数据,比如说将 fielda存储的数据移动到 fieldb中,需要将元数据中得路径修改为新的路径,并且将共享存储中得文件也复制到新路径下,这样做会产生很多相同的文件。如果fieldafieldb中存储的文件是同一个时,可以通过将两个字段的共享存储路径设置成相同的值,这样上传的文件都会存储在同一个目录下,在移动时只需要修改元数据即可。

TIP

使用共享存储路径时,多个字段在共享存储中文件是同一个,如果在其中一个字段上删除附件,其它字段中附件文件也将不能访问。

水印

在上传图片后,系统可以自动给上传的图片添加水印。系统支持两种水印格式

  • 文字水印(使用表达式计算水印文字,可以设置颜色、字号、旋转角度)
  • 图片水印(可以设置水印位置、透明度、旋转角度)