• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

JavaScriptを色々あれこれしようとするがひたすら失敗を繰り返している


Commit MetaInfo

Revision13 (tree)
Time2016-11-14 04:42:42
Authortakoyaki_umaaaa

Log Message

ファイル保存の実装
<kbd>tag</kbd>

Change Summary

Incremental Difference

--- HtmlDrawApp/HTMLDrawApp/bin/Debug/AppX/js/Common.js (revision 12)
+++ HtmlDrawApp/HTMLDrawApp/bin/Debug/AppX/js/Common.js (revision 13)
@@ -37,3 +37,63 @@
3737 }
3838 return (theta * 360 / (2 * Math.PI) - 90); // atan2は X軸基準での角度を出すため、画面表示系の Y軸基準に合わせるため 90を減算する
3939 };
40+
41+
42+class SaveFile {
43+ constructor() {
44+ this.filename = null;
45+ this.callbackComplete = null;
46+ this.callbackError = null;
47+ }
48+
49+ // ブラウザ上で実行している場合のファイル保存処理
50+ saveFileBrowser(filename, data) {
51+ // Blobに変換して download
52+ let blob = new Blob([data], { type: "text/plain" });
53+ let a = document.createElement('a');
54+ a.href = URL.createObjectURL(blob);
55+ a.target = '_blank';
56+ a.download = filename; // Edgeは無効……
57+ a.click();
58+
59+ // download完了後に memory解放したほうがいい
60+ // URL.revokeObjectURL();
61+ };
62+
63+ // アプリケーションとして実行している場合のファイル保存処理
64+ saveFileApp(filename, data, callbackComplete, callbackError) {
65+ if (null != callbackComplete) this.callbackComplete = callbackComplete;
66+ if (null != callbackError) this.callbackError = callbackError;
67+
68+ // Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる
69+ // write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも
70+ let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName;
71+ Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this));
72+ };
73+
74+ // 以下、Private関数 -------------------
75+
76+ saveFileAppOpenFile(savedata, file) { // [!!caution] callback設定時に savedataを無理やりbind済み
77+ // 実際に書き込まれた file nameを取得
78+ let name = file.name;
79+ // file objectの pathを参照すると保存先 folderが大変なことになっているが
80+ // 実際に保存される場所は Downloads/<ApplicationName>/ になる
81+
82+ // この時点で fileは既に open済みになっている
83+ // fileへデータ書き込み
84+ Windows.Storage.FileIO.writeTextAsync(file, savedata);
85+ // 書き込み完了チェック
86+ Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this));
87+
88+ };
89+ saveFileComplete() {
90+ // 保存完了
91+ debuglog('ファイル保存完了');
92+
93+ if (null != this.callbackComplete) this.callbackComplete();
94+ };
95+ saveFileError(err) {
96+ console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description);
97+ if (null != this.callbackError) this.callbackError(err.message);
98+ };
99+} // class SaveFile
--- HtmlDrawApp/HTMLDrawApp/bin/Debug/AppX/js/main.js (revision 12)
+++ HtmlDrawApp/HTMLDrawApp/bin/Debug/AppX/js/main.js (revision 13)
@@ -152,25 +152,28 @@
152152 // DisplayField 領域の innerHTMLを Blobとして保存
153153 function onClickSaveLink(evt) {
154154 debuglog('onClickSaveLink');
155+
155156 // 余計な表示情報を消す
156157 // clear focus
157158 window.partsFocus.setClingingPartner(null);
158-
159159 // 表示情報取得
160160 let displayInfo = window.displayField.DOMobject.innerHTML;
161+ // 保存先 file name
162+ let filename = 'savefile.txt';
163+ let save = new SaveFile();
161164
162- // Blobに変換して download
163- let blob = new Blob([displayInfo], { type: "text/plain" });
164- let a = document.createElement('a');
165- a.href = URL.createObjectURL(blob);
166- a.target = '_blank';
167- a.download = 'filename.txt'; // Edgeは無効……
168- a.click();
165+ // save.saveFileBrowser(filename, displayInfo);
166+ save.saveFileApp(filename, displayInfo, cmp, err);
167+ // Anime GIFなどを指定されていると保存に時間がかかる
168+ // 保存中 dialogが必要
169+ };
170+ function cmp() {
171+ debuglog('cmp');
172+ };
173+ function err(arg) {
174+ console.error('err');
175+ }
169176
170- // download完了後に memory解放したほうがいいらしいが……
171- // URL.revokeObjectURL();
172- };
173-
174177 function onClickPalButton(evt) {
175178 debuglog('【onClickPalButton' + evt.target.dataset.palid + '】');
176179 switch (parseInt(evt.target.dataset.palid)) {
--- HtmlDrawApp/HTMLDrawApp/js/Common.js (revision 12)
+++ HtmlDrawApp/HTMLDrawApp/js/Common.js (revision 13)
@@ -37,3 +37,63 @@
3737 }
3838 return (theta * 360 / (2 * Math.PI) - 90); // atan2は X軸基準での角度を出すため、画面表示系の Y軸基準に合わせるため 90を減算する
3939 };
40+
41+
42+class SaveFile {
43+ constructor() {
44+ this.filename = null;
45+ this.callbackComplete = null;
46+ this.callbackError = null;
47+ }
48+
49+ // ブラウザ上で実行している場合のファイル保存処理
50+ saveFileBrowser(filename, data) {
51+ // Blobに変換して download
52+ let blob = new Blob([data], { type: "text/plain" });
53+ let a = document.createElement('a');
54+ a.href = URL.createObjectURL(blob);
55+ a.target = '_blank';
56+ a.download = filename; // Edgeは無効……
57+ a.click();
58+
59+ // download完了後に memory解放したほうがいい
60+ // URL.revokeObjectURL();
61+ };
62+
63+ // アプリケーションとして実行している場合のファイル保存処理
64+ saveFileApp(filename, data, callbackComplete, callbackError) {
65+ if (null != callbackComplete) this.callbackComplete = callbackComplete;
66+ if (null != callbackError) this.callbackError = callbackError;
67+
68+ // Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる
69+ // write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも
70+ let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName;
71+ Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this));
72+ };
73+
74+ // 以下、Private関数 -------------------
75+
76+ saveFileAppOpenFile(savedata, file) { // [!!caution] callback設定時に savedataを無理やりbind済み
77+ // 実際に書き込まれた file nameを取得
78+ let name = file.name;
79+ // file objectの pathを参照すると保存先 folderが大変なことになっているが
80+ // 実際に保存される場所は Downloads/<ApplicationName>/ になる
81+
82+ // この時点で fileは既に open済みになっている
83+ // fileへデータ書き込み
84+ Windows.Storage.FileIO.writeTextAsync(file, savedata);
85+ // 書き込み完了チェック
86+ Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this));
87+
88+ };
89+ saveFileComplete() {
90+ // 保存完了
91+ debuglog('ファイル保存完了');
92+
93+ if (null != this.callbackComplete) this.callbackComplete();
94+ };
95+ saveFileError(err) {
96+ console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description);
97+ if (null != this.callbackError) this.callbackError(err.message);
98+ };
99+} // class SaveFile
--- HtmlDrawApp/HTMLDrawApp/js/main.js (revision 12)
+++ HtmlDrawApp/HTMLDrawApp/js/main.js (revision 13)
@@ -152,25 +152,28 @@
152152 // DisplayField 領域の innerHTMLを Blobとして保存
153153 function onClickSaveLink(evt) {
154154 debuglog('onClickSaveLink');
155+
155156 // 余計な表示情報を消す
156157 // clear focus
157158 window.partsFocus.setClingingPartner(null);
158-
159159 // 表示情報取得
160160 let displayInfo = window.displayField.DOMobject.innerHTML;
161+ // 保存先 file name
162+ let filename = 'savefile.txt';
163+ let save = new SaveFile();
161164
162- // Blobに変換して download
163- let blob = new Blob([displayInfo], { type: "text/plain" });
164- let a = document.createElement('a');
165- a.href = URL.createObjectURL(blob);
166- a.target = '_blank';
167- a.download = 'filename.txt'; // Edgeは無効……
168- a.click();
165+ // save.saveFileBrowser(filename, displayInfo);
166+ save.saveFileApp(filename, displayInfo, cmp, err);
167+ // Anime GIFなどを指定されていると保存に時間がかかる
168+ // 保存中 dialogが必要
169+ };
170+ function cmp() {
171+ debuglog('cmp');
172+ };
173+ function err(arg) {
174+ console.error('err');
175+ }
169176
170- // download完了後に memory解放したほうがいいらしいが……
171- // URL.revokeObjectURL();
172- };
173-
174177 function onClickPalButton(evt) {
175178 debuglog('【onClickPalButton' + evt.target.dataset.palid + '】');
176179 switch (parseInt(evt.target.dataset.palid)) {