更快更优化的文件上传方式

时间:2018-05-17 18:05:09

标签: javascript node.js asynchronous fs

我正在使用node.js中的图像上传功能,其中我有一个包含多个文件对象的数组,并且在每个数组中,默认存储文件路径是图像和优先级状态。喜欢这个

var imagesArr = [
    {path: "./img/img_3.jpg", priority: 3}, //exist
    {path: "./img/img_1.jpg", priority: 1}, //exist
    {path: "./img/img_5.jpg", priority: 5}, //exist
    {path: "./img/img_2.jpg", priority: 2}, //exist
    {path: "./img/img_4.jpg", priority: 4}, //exist
    {path: "./img/img_7.jpg", priority: 7}, //not exist
    {path: "./img/img_6.jpg", priority: 6}, //not exist
];

首先,我需要根据优先级对数组进行排序。所以我已经做了这个以获得新的排序数组。

var sortedFileArr = imagesArr.sort(function(a, b) {return (a.priority > b.priority) ? 1 : ((b.priority > a.priority) ? -1 : 0);} );

现在,我需要迭代数组以检查具有给定路径的每个文件是否存在。如果是,则它将上传到新的目标路径。如果不是,那么我重新检查该文件最多3次。如果没有,那么我需要发送没有找到文件的响应以及重试计数。到目前为止我已经完成了这项工作并且工作正常。我正在使用异步循环进行迭代。

var resp = [];
async.each(sortedFileArr, function(fileArrItem, outerCallback) {
    var searchCount = 0, fileFoundStatus = false, retryCount = 0;
    while(searchCount <= 2) {
        if(fs.existsSync(fileArrItem.path)) {
            fileFoundStatus = true;
            retryCount = searchCount;
            break;
        } else {
            fileFoundStatus = false;
            retryCount = searchCount+1;
        }
        searchCount++;  
    }

    if(fileFoundStatus) {
        let imgName = fileArrItem.path.split("/")[2];
        fs.createReadStream(fileArrItem.path).pipe(fs.createWriteStream("./newImg/"+imgName));
        resp.push({name: fileArrItem.path, status: "Found", retryCount: retryCount})
        outerCallback();
    } else {
        resp.push({name: fileArrItem.path, status: "Not Found", retryCount: retryCount})
        outerCallback();
    }   
}, function(err){
    console.log(resp);
})

现在,我的问题是,我可以用其他简单的方式或更优化的方式来做到这一点。提前感谢您的任何帮助。

0 个答案:

没有答案