首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NodeJS从IBM对象存储下载文件

使用NodeJS从IBM对象存储下载文件
EN

Stack Overflow用户
提问于 2017-04-05 18:30:40
回答 2查看 778关注 0票数 1

我在使用NodeJS脚本从下载文件时遇到了问题,问题是从存储中下载文件需要很长时间,100K文件需要大约21秒,等待第一个块大约8秒,其余时间用于读取所有块

我使用该服务存储图像,使用NodeJS脚本从存储区读取这些图像,这些图像是通过HTML标记下载的,那么我在这里到底做错了什么呢?

nodeJS代码:

代码语言:javascript
复制
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');
    });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-07 02:11:29

试着做这样的事情:

routes.js

代码语言:javascript
复制
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);
}

modules/object-storage.js

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-04-12 02:23:10

使用joe的答案,并且经过很少的修改,服务现在运行良好,我不得不更改库pkgcloud,因为它导致了bluemix的身份验证问题,我切换到包装包pkgcloud-bluemix-objectstorage,我的代码现在如下所示:

代码语言:javascript
复制
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);
        }
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43239002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档