{"id":4978,"date":"2022-02-17T10:54:59","date_gmt":"2022-02-17T02:54:59","guid":{"rendered":"http:\/\/123.57.164.21\/?p=4978"},"modified":"2022-02-17T10:54:59","modified_gmt":"2022-02-17T02:54:59","slug":"ibm-cloud-object-storage-nodejs%e4%b8%8a%e4%bc%a02gb%e5%a4%a7%e6%96%87%e4%bb%b6%e5%87%ba%e9%94%99","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=4978","title":{"rendered":"IBM Cloud Object Storage Nodejs\u4e0a\u4f202GB\u5927\u6587\u4ef6\u51fa\u9519"},"content":{"rendered":"\n<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528IBM Cloud Object Storage\u4fdd\u5b58\u6587\u4ef6\uff0cIBM Cloud Object Storage\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684SDK\uff0c\u65b9\u4fbf\u6211\u4eec\u64cd\u4f5cStorage\u3002\u6bd4\u5982Java\uff0c Nodejs\u7b49\u7b49\u3002<\/p>\n\n\n\n<p>\u5b98\u65b9\u6587\u6863\uff1ahttps:\/\/cloud.ibm.com\/docs\/cloud-object-storage\/libraries?topic=cloud-object-storage-node<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u5b98\u65b9\u7ed9\u7684Nodejs\u4e0a\u4f20\u5927\u6587\u4ef6\u7684Sample\u4ee3\u7801\uff1a<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u4ee3\u7801\u5b9e\u9645\u4f7f\u7528\u65f6\uff0c\u5bf9\u4e8e2GB\u4ee5\u4e0a\u7684\u5927\u6587\u4ef6\uff0c\u4f1a\u51fa\u9519\u3002\u539f\u56e0\u662f<strong> fs.readFile <\/strong>\u8fd9\u4e2a\u65b9\u6cd5\u672c\u8eab\u4e0d\u652f\u63012GB\u4ee5\u4e0a\u7684\u6587\u4ef6\uff0c\u56e0\u4e3a\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u628a\u6587\u4ef6\u8bfb\u5230\u5185\u5b58\u4e2d\uff0c\u5982\u679c\u6587\u4ef6\u8fc7\u5927\uff0c\u4f1a\u9020\u6210\u5185\u5b58\u6ea2\u51fa\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function multiPartUpload(bucketName, itemName, filePath) {\n    var uploadID = null;\n\n    if (!fs.existsSync(filePath)) {\n        log.error(new Error(`The file \\'${filePath}\\' does not exist or is not accessible.`));\n        return;\n    }\n\n    console.log(`Starting multi-part upload for ${itemName} to bucket: ${bucketName}`);\n    return cos.createMultipartUpload({\n        Bucket: bucketName,\n        Key: itemName\n    }).promise()\n    .then((data) => {\n        uploadID = data.UploadId;\n\n        \/\/begin the file upload \n        \/\/ \u6ce8\u610f\uff01\uff01\uff01  fs.readFile\u65b9\u6cd5\u4e0d\u652f\u63012GB\u4ee5\u4e0a\u7684\u6587\u4ef6\uff0c\u56e0\u4e3afs.readFile\u4f1a\u628a\u6587\u4ef6\u8bfb\u53d6\u5230\u5185\u5b58\u4e2d\uff0c\u5f53\u6587\u4ef6\u8fc7\u5927\u65f6\uff0c\u662f\u4e0d\u5141\u8bb8\u7684\u3002    \n        fs.readFile(filePath, (e, fileData) => {\n            \/\/min 5MB part\n            var partSize = 1024 * 1024 * 5;\n            var partCount = Math.ceil(fileData.length \/ partSize);\n    \n            async.timesSeries(partCount, (partNum, next) => {\n                var start = partNum * partSize;\n                var end = Math.min(start + partSize, fileData.length);\n    \n                partNum++;\n\n                console.log(`Uploading to ${itemName} (part ${partNum} of ${partCount})`);  \n\n                cos.uploadPart({\n                    Body: fileData.slice(start, end),\n                    Bucket: bucketName,\n                    Key: itemName,\n                    PartNumber: partNum,\n                    UploadId: uploadID\n                }).promise()\n                .then((data) => {\n                    next(e, {ETag: data.ETag, PartNumber: partNum});\n                })\n                .catch((e) => {\n                    cancelMultiPartUpload(bucketName, itemName, uploadID);\n                    console.error(`ERROR: ${e.code} - ${e.message}\\n`);\n                });\n            }, (e, dataPacks) => {\n                cos.completeMultipartUpload({\n                    Bucket: bucketName,\n                    Key: itemName,\n                    MultipartUpload: {\n                        Parts: dataPacks\n                    },\n                    UploadId: uploadID\n                }).promise()\n                .then(console.log(`Upload of all ${partCount} parts of ${itemName} successful.`))\n                .catch((e) => {\n                    cancelMultiPartUpload(bucketName, itemName, uploadID);\n                    console.error(`ERROR: ${e.code} - ${e.message}\\n`);\n                });\n            });\n        });\n    })\n    .catch((e) => {\n        console.error(`ERROR: ${e.code} - ${e.message}\\n`);\n    });\n}\n\nfunction cancelMultiPartUpload(bucketName, itemName, uploadID) {\n    return cos.abortMultipartUpload({\n        Bucket: bucketName,\n        Key: itemName,\n        UploadId: uploadID\n    }).promise()\n    .then(() => {\n        console.log(`Multi-part upload aborted for ${itemName}`);\n    })\n    .catch((e)=>{\n        console.error(`ERROR: ${e.code} - ${e.message}\\n`);\n    });\n}<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-1024x132.png\" alt=\"\" class=\"wp-image-4980\" width=\"715\" height=\"92\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-1024x132.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-300x39.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-768x99.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-1536x197.png 1536w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-830x107.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-230x30.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-350x45.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5-480x62.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2022\/02\/\u56fe\u7247-5.png 1588w\" sizes=\"(max-width: 715px) 100vw, 715px\" \/><\/figure><\/div>\n\n\n\n<p>\u4e0b\u9762\u662f\u4fee\u6539\u540e\u7684\u4ee3\u7801\uff0c\u7528<strong>fs.openSync<\/strong>\u4ee3\u66ff\u4e86<strong> fs.readFile<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function uploadItem(itemName, filePath) {\n\n    var p = new Promise((resolve, reject) => {\n\n        let uploadID = null;\n\n        if (!fs.existsSync(filePath)) {\n            reject(itemName)\n            return;\n        }\n\n        cos.createMultipartUpload({\n            Bucket: environment.bucketName,\n            Key: itemName,\n        }).promise()\n            .then((data) => {\n\n                uploadID = data.UploadId;\n\n                fs.readFile(\"server.js\", (e, fileData) => {\n\n                    \/\/ \u8fd9\u91cc\u4f7f\u7528fs.statSync\u6765\u83b7\u5f97\u6587\u4ef6size\n                    var stats = fs.statSync(filePath);\n\n                    \/\/ \u8fd9\u91cc\u4f7f\u7528fs.openSync\u6765\u6253\u5f00\u5927\u6587\u4ef6\n                    var fd = fs.openSync(filePath, 'r');\n\n                    \/\/ min 40MB part\n                    const partSize = 1024 * 1024 * 40;\n                    const partCount = Math.ceil(stats.size \/ partSize);\n\n                    async.timesSeries(partCount, (partNum, next) => {\n                        \/\/ \u8ba1\u7b97\u6bcf\u6b21\u7684\u6e38\u6807\u5f00\u59cb\u4f4d\u7f6e\n                        const start = partNum * partSize;\n                        \/\/ \u8ba1\u7b97\u6bcf\u6b21\u7684\u6e38\u6807\u7ec8\u4e86\u4f4d\u7f6e\n                        const end = Math.min(start + partSize, stats.size);\n\n                        \/\/ \u8fd9\u91cc\u4f7f\u7528\u6309\u6e38\u6807\u548c\u5b57\u8282\u6570\u6765\u8bfb\u53d6\u6587\u4ef6\u3002\n                        var bufferRead = Buffer.alloc(end - start);\n                        fs.readSync(fd, bufferRead, 0, end - start, start);\n                        \n                        partNum++;\n\n                        cos.uploadPart({    \n                            Body: bufferRead,\n                            Bucket: environment.bucketName,\n                            Key: itemName,\n                            PartNumber: partNum,\n                            UploadId: uploadID,\n                        }).promise()\n                            .then((data) => {\n                                next(e, {ETag: data.ETag, PartNumber: partNum});\n                            })\n                            .catch((e) => {\n                                fs.close(fd);\n                                reject(itemName)\n                            });\n                    }, (e, dataPacks) => {\n                        \/\/ \u5173\u95ed\u6587\u4ef6\n                        fs.close(fd);\n                        \/\/ \u5b8c\u6210\u4e0a\u4f20\n                        cos.completeMultipartUpload({\n                            Bucket: environment.bucketName,\n                            Key: itemName,\n                            MultipartUpload: {\n                                Parts: dataPacks,\n                            },\n                            UploadId: uploadID,\n                        }).promise()\n                        \/\/ \u5220\u9664\u6587\u4ef6\n                        fs.unlink(filePath, function (err) {\n                            if (err) {\n                                reject(itemName)\n                                return;\n                            }\n                            resolve(itemName)\n                        })\n                    });\n                });\n            })\n            .catch((e) => {\n                fs.close(fd);\n                reject(itemName);\n            });\n    });\n    return p;\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528IBM Cloud Object Storage\u4fdd\u5b58\u6587\u4ef6\uff0cIBM Cloud Object Sto [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/4978"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4978"}],"version-history":[{"count":4,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/4978\/revisions"}],"predecessor-version":[{"id":4983,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/4978\/revisions\/4983"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}