上传文件

aki发表于:2016年09月09日 13:57:23更新于:2020年11月17日 13:17:14

Index

上传文件

将文件上传到附件字段的API。

  • 上传的文件的文件Key可用于添加或更新记录等。

  • 一次最多可上传一个文件。

  • 使用获取记录API获取到的文件Key不能用于上传文件。

※上传文件 API不支持使用kintone.api() 发送 REST API 请求

HTTP 方法

POST

URI

https://(子域名).cybozu.cn/k/v1/file.json

来宾空间

https://(域名).cybozu.cn/k/guest/(空间ID)/v1/file.json

必要的访问权限


※如果上传的文件需要跟记录关联,请参考添加记录以及更新记录时必要的访问权限。

请求格式

  • 使用multipart/form-data格式发送请求。详情请参照RFC1867、RFC2388。

  • Content-Disposition 内的name指定「file」、filename指定文件名。 
    ※如果是中文文件,使用GBK编码指定内容。

请求的范例

包含请求头部的范例

发送文件内容为【test】的 test.txt 文件时
POST /k/v1/file.json HTTP/1.1
Host: example.cybozu.cn:443
X-Cybozu-Authorization: cnlvX2Z1a3VkYTpjeWJvenU=
Content-Type: multipart/form-data; boundary=---------------------------bee48a285354
Content-Length: 188

-----------------------------bee48a285354
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

test

-----------------------------bee48a285354--

应答的范例

将返回所上传的文件的文件Key。在使用数据添加、数据更新等API时,文件Key可作为附件字段的值来使用(下文)。

{
    "fileKey": "c15b3870-7505-4ab6-9d8d-b9bdbc74f5d6"
}

所上传的文件和记录的关联

在执行添加或更新API时,获取到的文件Key可作为附件的值来使用,如下。

请求头部(使用更新记录的API时)
PUT /k/v1/record.json HTTP/1.1
Host: example.cybozu.cn:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
Authorization: Basic QWRtaW5pc3RyYXRvcjpjeWJvenU=
Content-Type: application/json
  • 请在Content-Type中指定application/json。如不指定,JSON 无法识别,执行时将报错。

正文(使用更新记录API时)
{
    "app": 7,
    "id": 1,
    "record": {
        "attached_file": {
            "value": [
                {
                    "fileKey": " c15b3870-7505-4ab6-9d8d-b9bdbc74f5d6"
                }
            ]
        }
    }
}

限制事项

  • 上传后的文件如果没有通过添加记录API或更新记录API添加到记录中时,该文件将在3天后删除。

  • 保存在临时保存空间中的文件所占的空间也将算到磁盘使用量中。

其他请参考限制事项 。

相关Tips

JavaScript范例

XMLHttpRequest

var blob = new Blob(["Sample Test File"], {type: "text\/plain"});
var formData = new FormData();
formData.append("__REQUEST_TOKEN__", kintone.getRequestToken());
formData.append("file", blob, "test.txt");

var url = 'https://{subdomain}.cybozu.cn/k/v1/file.json';
var xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onload = function() {
    if (xhr.status === 200) {
        // success

        console.log(JSON.parse(xhr.responseText));
    } else {
        // error

        console.log(JSON.parse(xhr.responseText));
    }
};
xhr.send(formData);


回复(3)

  • closer

    c# 我是这样写的

    1

    public static string HttpPostData (string url, int timeOut, string fileKeyName, string filePath, string API_Token, string Host, string authorCode) {

        string responseContent;

        var memStream = new MemoryStream ();

        var webRequest = (HttpWebRequest) WebRequest.Create (url);

        if (url.StartsWith ("https", StringComparison.OrdinalIgnoreCase)) {

            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback (CheckValidationResult);

            webRequest = WebRequest.Create (url) as HttpWebRequest;

            webRequest.ProtocolVersion = HttpVersion.Version11;

        } else {

            webRequest = WebRequest.Create (url) as HttpWebRequest;

        }

    }

    // 边界符            

    var boundary = "---------------" + DateTime.Now.Ticks.ToString ("x");

    // 边界符            

    var beginBoundary = Encoding.ASCII.GetBytes ("--" + boundary + "\r\n");

    var fileStream = new FileStream (filePath, FileMode.Open, FileAccess.Read);

    // 最后的结束符            

    var endBoundary = Encoding.ASCII.GetBytes ("--" + boundary + "--\r\n");

    // 设置属性            

    webRequest.Method = "POST";

    webRequest.Timeout = timeOut;

    webRequest.Headers.Add ("X-Cybozu-API-Token", API_Token);

    webRequest.Host = Host;

    webRequest.Headers.Add ("Authorization", "Basic " + authorCode);

    webRequest.ContentType = "multipart/form-data; boundary=" + boundary;

    // 写入文件

    const string filePartHeader = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n";

    var header = string.Format (filePartHeader, fileKeyName, filePath);

    var headerbytes = Encoding.UTF8.GetBytes (header);

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

    memStream.Write (beginBoundary, 0, beginBoundary.Length);

    memStream.Write (headerbytes, 0, headerbytes.Length);

    var buffer = new byte[1024];

    int bytesRead;

    // =0            

    while ((bytesRead = fileStream.Read (buffer, 0, buffer.Length)) != 0) { memStream.Write (buffer, 0, bytesRead); }

    // 写入字符串的Key

    var stringKeyHeader = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"" + "\r\n\r\n{1}\r\n";

    // 写入最后的结束边界符      

    memStream.Write (endBoundary, 0, endBoundary.Length);

    webRequest.ContentLength = memStream.Length;

    var requestStream = webRequest.GetRequestStream ();

    memStream.Position = 0;

    var tempBuffer = new byte[memStream.Length];

    memStream.Read (tempBuffer, 0, tempBuffer.Length);

    memStream.Close ();

    requestStream.Write (tempBuffer, 0, tempBuffer.Length);

    requestStream.Close ();

    var httpWebResponse = (HttpWebResponse) webRequest.GetResponse ();

    using (var httpStreamReader = new StreamReader (httpWebResponse.GetResponseStream (), Encoding.GetEncoding ("utf-8"))) { responseContent = httpStreamReader.ReadToEnd (); } fileStream.Close ();

    httpWebResponse.Close ();

    webRequest.Abort ();

    return responseContent;

    }

    报错502

  • betsy_yan

    HTTP 方法:POST

    URI:https://(子域名).cybozu.cn/k/v1/file.json

    具体怎么调用你可以看本文后面的范例。

    引用 closer 的回复:

    请问,上传文件要怎么调用接口

  • closer

    请问,上传文件要怎么调用接口

注意:贴代码时请注意格式并使用"代码语言",与本文无关的问题请至“讨论社区”提问。