レコード新規追加時にファイルアップロードと関連付けを行うと空のエラーが返されます

kintoneに用意されているアップロードボタンではなく
スペースにこちらで設けたアップロードボタンから
ファイルをアップロードした後にレコードを新規追加し
アップロードされたファイルと追加したレコードとの関連付けを行いたいのですが
こちらのページを参考に試してみたのですが
関連付け自体は上手くいってるようなのですが
関連付けの結果が成功ではなくエラーの方で返されてしまいます。
そのエラーの内容はエラーコードもエラーメッセージもない空のものでした。
上手くいってると書きましたが、頻繁ではないですが失敗する事もあるようでした。

最初はレコードの保存時にアップロードと関連付けを一気にやろうとしたのですが
通信タイミングがとれないのか上手くいかなかったので
アップロードボタンを押しファイル選択を行った後にアップロードを行い
レコードの保存時(新規追加)に改めて関連付けを行うと見かけ上は
上手くいくようになったのですが、エラーの反応とエラーの内容から
あまり気持ちのいいものではないので
解決する方法がないでしょうか?よろしくお願いします。

なお、こちらのページに似たような質問があり見てみたのですが
fileKeyと記述しており大文字小文字の違いでもなさそうでした。

こんにちは!

実際に書かれたコードを貼り付けていただくと、回答が得やすいかと思います!
問題が無さそうに見えても、百戦錬磨のエンジニアの方が見ると突っ込みどころがあるかも知れません:eyes::sparkles::sparkles:

juridonさん、コメントありがとうございます!
そして失礼しました、コードを貼り付けておきます・・・

function set_record_key(event){
return new Promise((resolve, reject) => {
var key = $('#file_key').val();
var record = event.record;
var json = {
app: kintone.app.getId(),
id: record.$id.value,
record: {
file: {
value: [{fileKey: key}]
}
}
};
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', json, function(res) {
console.log("成功、ファイル登録の結果 : " + JSON.stringify(res));
}, function(error) {
console.log("失敗、ファイル登録の結果: " + JSON.stringify(error));
});
});
}

kintone.events.on('app.record.create.submit.success', function(event) {
new kintone.Promise(function(resolve, reject) {
set_record_key(event);
});
});

コードの貼り付けありがとうございます。

 

>関連付け自体は上手くいってるようなのですが
とのことで、
スペースフィールドでアップロードとfileKey(アップロード用)の取得をされていると思うのですが、
どのようにその関連付けの部分はどのようにコード書かれていますか??
↓これのkey取得元のことが知りたいです~

var key = $('#file_key').val();

 

遅くなってすみません・・・
アップロードフォームの参照ボタンを押しファイルを選択した段階で
FileAPIを利用しファイルを読み取ったバイナリデータを
アップロードし、そこから得られたFileKeyを一応

$('#file_key').val(file_key);

に一時的に保存するという形をとっています。
以下のようになります。
よろしくお願いします。

$('#input-file').on('change', function(e)
{
read_binary_data(e, event).then((data) => {

var bin = new ArrayBuffer(data.length);
var ui8a = new Uint8Array(bin, 0);
for (var i = 0; i < data.length; i++) ui8a[i] = (data.charCodeAt(i) & 0xff);

var blob = new Blob([ui8a], {
type: e.type
});
// FormDataにファイルを格納
var formData = new FormData();
formData.append(' __REQUEST_TOKEN__', kintone.getRequestToken());
formData.append('file', blob, e.target.files[0].name);

var xmlHttp = new XMLHttpRequest();
xmlHttp.open('POST', kintone.api.url('/k/v1/file', true), true);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xmlHttp.send(formData);
xmlHttp.onload = function() {
if (xmlHttp.status === 200) {
var file_key = JSON.parse(xmlHttp.responseText).fileKey;
$('#file_key').val(file_key);
}else{
alert("Error");
}
};
});
});

 

こんにちは!

アップロード自体は200が返ってきて、$(‘#file_key’).val(file_key);で#file_keyの要素にはアップロードのfileKeyが書かれているということですね:eyes:
PUTする時にエラーが出てしまうけど、ファイルは保存されているという感じですね(><)
コードを見た感じ、エラーが出そうな箇所は見つけられず:sweat_drops::sweat_drops:

 

もし、async/await を使ってコードを書くことに抵抗がなかったらですが、
コチラのライブラリ(kintone rest api client)を使われてみるといいかもしれません:eyes:
↓file関連のドキュメントです
https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/file.md

↓addRecord(レコード追加)
https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md#addRecord

async/awaitで
アップロードを待って(fileKeyを取得するのを待って)から、
レコード追加するというコードが(慣れればですが)書きやすいと思います。

Qiitaなどで「kintone-rest-api-client ファイル アップロード」など検索するとサンプルなど出てくると思います:eyes: