You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.1 KiB
65 lines
2.1 KiB
4 years ago
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
const crypto = require('crypto');
|
||
|
const {
|
||
|
debugLog,
|
||
|
checkAndMakeDir,
|
||
|
getTempFilename,
|
||
|
deleteFile
|
||
|
} = require('./utilities');
|
||
|
|
||
|
module.exports = (options, fieldname, filename) => {
|
||
|
const dir = path.normalize(options.tempFileDir);
|
||
|
const tempFilePath = path.join(dir, getTempFilename());
|
||
|
checkAndMakeDir({ createParentPath: true }, tempFilePath);
|
||
|
|
||
|
debugLog(options, `Temporary file path is ${tempFilePath}`);
|
||
|
|
||
|
const hash = crypto.createHash('md5');
|
||
|
let fileSize = 0;
|
||
|
let completed = false;
|
||
|
|
||
|
debugLog(options, `Opening write stream for ${fieldname}->${filename}...`);
|
||
|
const writeStream = fs.createWriteStream(tempFilePath);
|
||
|
const writePromise = new Promise((resolve, reject) => {
|
||
|
writeStream.on('finish', () => resolve());
|
||
|
writeStream.on('error', (err) => {
|
||
|
debugLog(options, `Error write temp file: ${err}`);
|
||
|
reject(err);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
dataHandler: (data) => {
|
||
|
if (completed === true) {
|
||
|
debugLog(options, `Error: got ${fieldname}->${filename} data chunk for completed upload!`);
|
||
|
return;
|
||
|
}
|
||
|
writeStream.write(data);
|
||
|
hash.update(data);
|
||
|
fileSize += data.length;
|
||
|
debugLog(options, `Uploading ${fieldname}->${filename}, bytes:${fileSize}...`);
|
||
|
},
|
||
|
getFilePath: () => tempFilePath,
|
||
|
getFileSize: () => fileSize,
|
||
|
getHash: () => hash.digest('hex'),
|
||
|
complete: () => {
|
||
|
completed = true;
|
||
|
debugLog(options, `Upload ${fieldname}->${filename} completed, bytes:${fileSize}.`);
|
||
|
if (writeStream !== false) writeStream.end();
|
||
|
// Return empty buff since data was uploaded into a temp file.
|
||
|
return Buffer.concat([]);
|
||
|
},
|
||
|
cleanup: () => {
|
||
|
completed = true;
|
||
|
debugLog(options, `Cleaning up temporary file ${tempFilePath}...`);
|
||
|
writeStream.end();
|
||
|
deleteFile(tempFilePath, err => (err
|
||
|
? debugLog(options, `Cleaning up temporary file ${tempFilePath} failed: ${err}`)
|
||
|
: debugLog(options, `Cleaning up temporary file ${tempFilePath} done.`)
|
||
|
));
|
||
|
},
|
||
|
getWritePromise: () => writePromise
|
||
|
};
|
||
|
};
|