使用NodeJS从IBM Bluemix Object Storage下载文件

时间:2017-04-05 18:30:41

标签: node.js ibm-cloud object-storage

我在使用NodeJS脚本从IBM Bluemix Object Storage下载文件时出现问题,问题是从存储中下载文件需要很长时间, 100K文件需要大约21秒, 8秒等待第一个块并休息以读取所有块

我正在使用该服务来存储图像,并使用NodeJS脚本从存储中读取这些图像,并且图像是通过HTML img标签下载的,那么究竟我在这里做错了什么?

nodeJS代码:

app.get("/ostore/image/:filename", function(request, response) {
    response.set('Content-Type', 'image/jpg');
    response.set('cache-control', 'max-age=604800');
    response.set('Last-Modified', 'Sat, 05 Dec 2015 03:17:48 GMT');
    var credentials = app.appEnv.services['Object-Storage'][0].credentials
    var pkgcloud = require("pkgcloud");
    var client = pkgcloud.storage.createClient({
        provider: 'openstack',
        username: credentials.userId,
        password: credentials.password,
        authUrl: credentials.auth_url,
        tenantId: credentials.projectId,
        region: credentials.region,
        version: "2"
    });
    client.download({
        container: app.storageContainer,
        remote: request.params.filename,
        stream: response
    }, function() {
        response.end('done');
    });
});

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

<强> routes.js

var vcap_os = require(__dirname + '/../utils/vcap')('Object-Storage'),
    os = require(__dirname + '/../modules/object-storage');

module.exports = function(app) {
    var router = app.loopback.Router();

    // proxy for object storage service
    router.get('/api/Products/image/:container/:file', function(req, res) {
        os(vcap_os.credentials).download(req.params.container, req.params.file, function(download) {
            download.pipe(res);
        });
    });

    app.use(router);
}

<强>模块/对象storage.js

var pkgcloud = require('pkgcloud');

module.exports = function(creds) {
    var config = {
        provider: 'openstack',
        useServiceCatalog: true,
        useInternal: false,
        keystoneAuthVersion: 'v3',
        authUrl: creds.auth_url,
        tenantId: creds.projectId,
        domainId: creds.domainId,
        username: creds.username,
        password: creds.password,
        region: creds.region
    };

    return {
        download: function(container, file, cbk) {
            var client = pkgcloud.storage.createClient(config);
            client.auth(function (error) {
                if(error) {
                    console.error("Authorization error for storage client (pkgcloud): ", error);
                }
                else {
                    var request = client.download({
                        container: container,
                        remote: file
                    });

                    cbk(request);
                }
            });
        }
    };
};

答案 1 :(得分:0)

使用joe的答案,经过少量修改,该服务现在工作正常,我不得不更改库pkgcloud,因为它导致bluemix的身份验证问题,我切换到包装程序包pkgcloud-bluemix-objectstorage,my代码现在看起来像这样:

app.get('/ostore/image/:filename', (request, response) => {
    const credentials = app.appEnv.services['Object-Storage'][0].credentials;
    const config = {};
    config.provider = 'openstack';
    config.authUrl = 'https://identity.open.softlayer.com/';
    config.region = credentials.region;
    config.useServiceCatalog = true;
    config.useInternal = true;
    config.tenantId = credentials.projectId;
    config.userId = credentials.userId;
    config.username = credentials.username;
    config.password = credentials.password;
    config.auth = {
        forceUri: 'https://identity.open.softlayer.com/v3/auth/tokens',
        interfaceName: 'public',
        identity: {
            methods: [
                'password'
            ],
            password: {
                user: {
                    id: credentials.userId,
                    password: credentials.password
                }
            }
        },
        scope: {
            project: {
                id: credentials.projectId
            }
        }
    };

    const client = pkgcloud.storage.createClient(config);
    client.auth(error => {
        if (error) {
            console.error('Authorization error for storage client (pkgcloud): ', error);
        } else {
            const download = client.download({
                container: app.storageContainer,
                remote: request.params.filename
            });
            download.on('response', res => {
                delete res.headers['content-type'];
                delete res.headers['last-modified'];
                res.headers['Last-Modified'] = 'Sat, 05 Dec 2015 03:17:48 GMT';
                res.headers['Cache-Control'] = 'public, max-age=2592000';
                res.headers['Expires'] = new Date(Date.now() + 2592000000).toUTCString();
                res.headers['Content-Type'] = 'image/jpg';
            }).pipe(response);
        }
    });
});