ローカル フォルダーを読み取り、関連ファイルを圧縮してサーバーにアップロードするコードがあります。
var dirEntry = fileSystem.createReader();
dirEntry.readEntries(
function (entries) {
if (entries.length === 0)
return;
var options = new FileUploadOptions();
/* Details omitted */
var zip = new JSZip();
// Map function from Ramda library
R.map(function (entry) {
var fileName = entry.name;
// Check that this is a file, and it's not a zip file.
if (entry.isFile && (fileName.indexOf(".zip", fileName.length - 4) == -1)) {
return entry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (evt) {
// Add the file to the Zip
zip.file(fileName, evt.target.result);
};
reader.readAsArrayBuffer(file);
}, function (error) { // ignore });
}
return null;
}, entries);
fileSystem.getFile(options.fileName, { create: true, exclusive: false },
function (fileEntry) {
fileEntry.createWriter(function (writer) {
// Generate the binary Zip file
var content = zip.generate({ type: "blob", compression: "DEFLATE" });
// Upload the file after it's persisted to storage
writer.onwriteend = function (evt) {
var ft = new FileTransfer();
ft.upload(fileEntry.nativeURL,
UPLOAD_SERVER_URL,
function (data) { // Ignore },
function (error) { // Ignore },
options)
};
// Persist the zip file to storage
writer.write(content);
}, function (error) {
// Ignore
});
}, function (error) {
// Ignore
});
}
, errorFunction);
問題は、空のファイルがアップロードされることがありますが、これは決して起こらないことです。したがって、Zip ファイルが作成されてストレージに書き込まれる前にファイルがアップロードされるのは、おそらく同期の問題です。どこに問題があるのか わかりません。Map 関数から Promise を返してから Promise.all(...).then() パターンを使用してみましたが、まだ空のファイルが表示されることがあります。したがって、私の実装が間違っていたか、zip.generate() も非同期で実行されます (またはその両方)。
zip ファイルをアップロードする前に、そのファイルがストレージに完全に書き込まれていることを確認するにはどうすればよいですか?