cybozu developer network

カテゴリー内の他の記事

kintoneの添付ファイルをJSZipで一括ダウンロードしよう

kintoneにファイルをいっぱい詰め込んだんだけど、ファイルのダウンロードは一つずつしかできないと嘆いている、そこのアナタに朗報です!
Cybozu CDNに登録されているJSZipを用いて、添付ファイルをZipファイルで一括ダウンロードする方法をご紹介いたします。

添付ファイルの一括ダウンロード/アップロードなどの操作について、
kintone コマンドラインツールを使ったやり方の説明記事もあります。
興味のある方はこちらをご覧ください。

はじめに

今回は一括ダウンロードをより簡単に実装するため、Cybozu CDN外のライブラリを利用します。
そのような場合は、一旦ファイルをダウンロードしてからアプリに適用しましょう。
また、今回紹介する記事で確認したライブラリのバージョンは以下の通りです。 

JSZipUtilsと、FileSaver.jsはgithub上で公開されているものを取得する方法をオススメいたします。

デモ環境

こちらのデモ環境から実際に動作を確認できます。
https://dev-demo.cybozu.com/k/264/

デモ環境の利用は、事前に cybozu developer network のメンバー登録が必要です。画面右上の「サインイン」ボタンよりご登録ください。
デモ環境アカウントとパスワードは、サインイン後にこちらのページでご確認ください。

一括ダウンロードの仕組み

今回kintoneからファイルを一括ダウンロードする処理順序は以下の通りです。

kintone上の添付ファイルをダウンロードするためには、レコードの取得とURL生成が必要です。

この点に関しては以下のサンプルで紹介していますので、参考にしましょう。

ファイルダウンロードで必須となる2つの手順

また、「レコードの取得」、「URLの作成」、「ファイルのダウンロード」は非同期通信で行われる点に注意しましょう。

JavaScriptソースコード

ソースコード

ソースコード解説

一覧画面に一括ダウンロードボタンを配置し、ボタンが押されたタイミングでgetZipFile関数が呼ばれます。

このgetZipFiles関数にてプロミスチェーンを実装し、処理順序を明確にしています。

プロミスを利用すると処理順序が明確になり、非同期処理を簡単に扱えます。

また、then()に関数を渡すと、関数の第一引数に前のプロミスの返り値の内容が渡される仕組みを利用しています。

これにより、getFileKeysにレコードの一括取得(getAppRecords)の結果のオブジェクトが渡り、filekeyの一覧を抽出しています。

その後も同様に処理を重ねて、必要な情報を後処理に渡して繋げていきます。

使い方

ソース上部のfieldCodeの値を添付ファイルのフィールドコードに変更する必要があります。

変更した後、JSファイル(以下例ではdownload.js)をアップロードしましょう。

mceclip0.png

注意事項

ファイル名に日本語が含まれている場合、文字化けが発生することがあります。

本サンプルではレコードの取得は100件までとなっております。

本サンプルはサブテーブルの添付ファイルには対応しておりません。

FileSaver.jsの制限事項として、ブラウザによってファイルサイズに上限があります。

エラー処理が不十分な部分がありますので、実装される際はご留意のほどお願いいたします。

 

最後に

今回は一括ダウンロードの手法を紹介させていただきました。

最低限の機能実装でも結構なボリュームがありますが、この後レコードごとにフォルダを分けたり、ファイル名を可変にしたり、ファイルのダウンロード中はspin.jsを利用するなど色々な拡張ができると思います。

色々なカスタマイズを行い、是非ともコミュニティへご投稿ください!

 

このTipsは、2022年12月版 kintoneで確認したものになります。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
佐藤

お世話になっております。

この記事を参考に実装して、実行したところ、「saveAs is not defined」のエラーになってしまいます・・・

https://github.com/eligrey/FileSaver.js/blob/master/src/FileSaver.js

を使っています。何かわかれば教えていただけると助かります・・・

 

Avatar
佐藤

自己解決しました。https://github.com/eligrey/FileSaver.js/blob/master/src/FileSaver.js の先頭の

export var saveAs = saveAs の「export」を削除して、jszip のURLを

https://js.cybozu.com/jszip/v3.1.5/jszip.min.js

にしたところ、動きました。また、本ページの注意事項のところに「ファイル名に日本語が含まれている場合、文字化けが発生します」と記載がありますが、Firefoxで実行したところ、文字化けせずにダウンロードできました!ので共有しておきます♫

 

Avatar
cybozu Development team

佐藤様

フィードバックをありがとうございます。

以下の点、確認して反映いたします。

>https://github.com/eligrey/FileSaver.js/blob/master/src/FileSaver.js の先頭の

export var saveAs = saveAs の「export」を削除して、

>jszip のURLを

https://js.cybozu.com/jszip/v3.1.5/jszip.min.js

>本ページの注意事項のところに「ファイル名に日本語が含まれている場合、文字化けが発生します」と記載がありますが、Firefoxで実行したところ、文字化けせずにダウンロードできました!

 

Avatar
佐藤

ご担当者様

宜しくお願いいたします。

※ 因みに、Firefoxとは、MacのFirefoxです。(WindowsのFirefoxでは文字化けしてしまいました)

Avatar
3s

初心者です

各レコードの添付ファイルを保存したい場合のコードを教えて頂きたいです

 

1レコードに添付ファイルは3つ、どれもjpg写真です

文字列フィールドに入力した番号(管理番号)の名前でダウンロードする事は可能ですか?

例 AA0001が管理番号の場合、AA0001-1.jpg、AA0001-2.jpg、AA0001-3.jpg、

 

何とか一括ダウンロードの処理ができたのですが、添付の1枚しかダウンロードが出来ず困っております

どうぞ宜しくお願い致します

Avatar
cybozu Development team

3s 様

お世話になっております。
cybozu developer network 事務局です。

こちらのコメント欄は記事へのフィードバック用となります。
質問が記事のシナリオと異なる場合、コミュニティでの質問をお願いしております。
恐れ入りますが、以下のコミュニティで再度ご投稿いただけますでしょうか。

kintone カスタマイズ フォーラム
https://developer.cybozu.io/hc/ja/community/topics/200034345


よろしくお願い申し上げます。

Avatar
川村

フォーラムの方で、こちらのソースを元にファイル名の変更方法について質問がありましたので、回答しました。参考としてこちらで共有します。

https://developer.cybozu.io/hc/ja/community/posts/11214331821081/comments/11249175623961

川村により編集されました
サインインしてコメントを残してください。