上传文件时的3个必要步骤

aki发表于:2017年02月03日 15:15:24更新于:2022年10月13日 13:53:32

本Tips介绍的是通过JavaScript给kintone的记录添加附件的方法。
如果可以通过JavaScript上传文件,那么就可以实现不同应用之间的连动。例如,可以按一下按钮就把应用A的附件添加到应用B里。

顺便一提,上传文件 API 不支持使用kintone.api() 发送 REST API 请求。(2014/04时确认的情况)
因此,本次通过XMLHttpRequest和CSRF令牌的方式上传文件。

  • 为了让系统能够识别上传的文件是附件,需要预先在应用中添加附件字段。 

开发步骤和流程

  • 将文件设置为FormData格式

  • 上传文件并获取其fileKey

  • 关联获取到的fileKey和记录

用FormData准备好要上传的文件

首先,作为事前准备,需要把文件保存成FormData格式,以便通过HttpRequest形式发送。

将文件暂时保持成Blob格式后再设置成FormData格式。

创建Text文件

blob = new Blob(["测试文件"], {
    type: "text/plain"
});
// 在FormData中保持文件
var formData = new FormData();
formData.append("__REQUEST_TOKEN__", kintone.getRequestToken());
formData.append("file", blob, "test.txt");

上传文件并获取fileKey

将文件上传到服务器,并接收其返回值中的fileKey。
※ 这里获取的fileKey不能用于文件下载。
上传时,将前面提到的FormData通过HttpReques发送。

上传文件 API 不支持使用 kintone.api() 发送 REST API 请求。 以下示例代码使用了XMLHttpRequest。

发送HttpRequest

var xmlHttp = new XMLHttpRequest();
xmlHttp.open('POST', kintone.api.url('/k/v1/file', true), false);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xmlHttp.onload = function() {
  if (xmlHttp.status === 200) {
    var key = JSON.parse(xmlHttp.responseText).fileKey;
    // 继续将上传的文件与记录相关联
  }
};
xmlHttp.send(formData);

HTTP应答以如下JSON格式返回。

返回数据

{"fileKey": "590279cd-6657-419f-8fac-d760a4a6caaa"}

上传的文件和记录的关联

将刚才获取的fileKey和所指定的记录关联。

关联后,文件就会被设为记录的附件。

在现有记录基础上添加附件

var json = {
    app: kintone.app.getId(),
    id: kintone.app.record.getId(),
    record: {
        file: {
            value: [{
                fileKey: key
            }]
        }
    }
};
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', json);

 以上就完成文件上传了。

该Tips在2014年4月版中进行过确认。


回复(10)

  • cybozu

    是字段代码。

    引用 closer 的回复:

    12345678910json = {    app: kintone.app.getId(),    id: kintone.app.record.getId(),    record: {        file: {            value: [{                fileKey: key            }]        }    }}更新key的json里面的file是字段代码还是?

  • closer


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    json = {
        app: kintone.app.getId(),
        id: kintone.app.record.getId(),
        record: {
            file: {
                value: [{
                    fileKey: key
                }]
            }

        }

    }

    更新key的json里面的file是字段代码还是?

    引用 cybozu 的回复:

    上面有说※ 这里获取的fileKey不能用于文件下载。

  • closer

    是不是因为附件是属于table的字段,上传文件时要指定table的行id

    引用 closer 的回复:

    我是把上传的文件返回的key做绑定的

  • closer

    我是把上传的文件返回的key做绑定的

    引用 cybozu 的回复:

    上面有说※ 这里获取的fileKey不能用于文件下载。

  • cybozu

    上面有说※ 这里获取的fileKey不能用于文件下载。

    引用 closer 的回复:

    请问,我将返回所上传的文件的文件Key更新记录API添加到记录中,更新成功了,为什么在记录中看不到上传的文件?

  • closer

    请问,我将返回所上传的文件的文件Key更新记录API添加到记录中,更新成功了,为什么在记录中看不到上传的文件?

  • betsy_yan

    不好意思,我们暂不提供具体实现的技术支持。

    引用 closer 的回复:

    怎么上传文件,那个Javascript范例,我是用c#来实现,要怎么用

  • closer

    怎么上传文件,那个Javascript范例,我是用c#来实现,要怎么用

    引用 betsy_yan 的回复:

    不太理解你说的动态库的意思,能否详细说明。你还可以参考以下文档:https://cybozudev.kf5.com/hc/kb/article/1004305/https://cybozudev.kf5.com/hc/kb/article/1004319/

  • betsy_yan

    不太理解你说的动态库的意思,能否详细说明。

    你还可以参考以下文档:

    https://cybozudev.kf5.com/hc/kb/article/1004305/

    https://cybozudev.kf5.com/hc/kb/article/1004319/

    引用 closer 的回复:

    请问,有没有访问kintone接口的动态库

  • closer

    请问,有没有访问kintone接口的动态库