元々別管理していた内容と添付ファイルが存在していて、kintoneで管理を行いたいのですが、ファイル量がけっこうな数あるので、一括で登録できる処理を作りたいと思っています。
・kintoneの一覧画面でボタンをクリックし、ローカルからファイルを選択
・選択したファイルをアップロードして、ファイル名と一致するキー情報のレコードに関連付けする
という処理を作りたいです。
現在の状態が、
・テストファイルを作ってサーバーにアップロードし、指定したレコードに関連付けされる
・ローカルからファイルを選択し、その内容が表示される
わからないと思っているところは、
・上の組み合わせの書き方がわからない
※選んだファイルをサーバーにアップロードしたい
・ファイルを複数選択したい(フォルダ毎選びたい)
の2点です。知恵をお貸しいただきたく思います。
// テストファイルを作成
const blob = new Blob(['テストファイルです'], {
type: 'text/plain'
});
// FormDataにファイルを格納
const formData = new FormData();
formData.append(' __REQUEST_TOKEN__', kintone.getRequestToken());
formData.append('file', blob, 'test.txt');
const xmlHttp = new XMLHttpRequest();
xmlHttp.open('POST', kintone.api.url('/k/v1/file', true), false);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xmlHttp.onload = () => {
if (xmlHttp.status === 200) {
const key = JSON.parse(xmlHttp.responseText).fileKey;
}
};
xmlHttp.send(formData);
(function() {
"use strict";
//一覧画面を開いた時の処理
kintone.events.on(['app.record.index.show'],function(event) {
list_show(event);
});
function list_show(event) {
if (document.getElementById('my_index_button') !== null) {
return;
}
// 一覧画面にボタンを作成
var myIndexButton = document.createElement('button');
myIndexButton.id = 'my_index_button';
myIndexButton.innerHTML = '添付ファイル選択';
// ボタンクリック時の処理
myIndexButton.onclick = function() {
const showOpenFileDialog = () => {
return new Promise((resolve, reject) => {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.txt, text/plain';
input.onchange = event => { resolve(event.target.files[0]); };
input.click();
setTimeout(() => { reject("timeout!"); }, 5000);
});
};
const readAsText = file => {
return new Promise(resolve => {
const reader = new FileReader();
reader.readAsText(file);
reader.onload = () => { resolve(reader.result); };
});
};
(async () => {
const file = await showOpenFileDialog();
const content = await readAsText(file);
// 内容表示
alert(content);
// テストファイルのアップロード
update_list(event);
})();
};
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
}
function update_list(event) {
//一覧情報の取得
var record_array = [];
var records = event.records;
// 取得レコードループ
for (var i = 0; i < records.length; i++) {
var record = records[i];
// レコードのキーとファイル名を比較(暫定的に、キーの値が1のレコードに更新)
if(event.records[i].key.value == "1") {
var record_obj = {
"id": record['レコード番号']['value'],
"record": {"file": {"value": [JSON.parse(xmlHttp.responseText)]}}
};
record_array.push(record_obj);
}
}
var body = {
"app": kintone.app.getId(),
"records": record_array
};
kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', body,
function(resp) {
// success
alert('更新完了');
}, function(error) {
// error
var errmsg = 'レコード更新時にエラーが発生しました。';
if (error.message !== undefined) {
errmsg += '' + error.message;
}
alert(errmsg);
});
}
})();