自动在nodejs put请求中附加不需要的字符

时间:2016-05-31 12:59:53

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

我使用Bluemix模块在​​request对象存储上上传文件api。一切都很好,但有一些不需要的字符会自动附加。

example:  
--38oi85df-b5d1-4d42-81ce-c547c860b512 //this is unwanted character
  Email 
 abc@gmail.com
 hsl@gmsl.com 
 pjeyjle@cse.com
--38oi85df-b5d1-4d42-81ce-c547c860b512-- // this is unwanted character

这是我的代码: -

import request from 'request';

exports.putObjectStorageFile = function(authToken, file, csv, cb) {  
var s = new stream.Readable();   
s._read = function noop() {}; 
s.push(csv); //csv is string   
s.push(null);   
var options = {
    url: 'https://xxxx.objectstorage.open.xxxx.com/v1/AUTH_' + config.objectStorage.projectId + '/xxxx/' + file,
    method: 'PUT',
    preambleCRLF: true,
    postambleCRLF: true,
    encoding: 'utf-8',
    headers: {
      'Content-Type': 'text/html; charset=UTF-8',
      'Content-Length': 1,
      'X-Auth-Token': authToken
    },
    multipart: {
      chunked: false,
      data: [
        { body: s }
      ]
    }   };

  function callback(error, response) {
    if (error) cb(error);
    if (!error && response.statusCode == 201) {
      cb(null);
    } 
  }   
request(options, callback); 

2 个答案:

答案 0 :(得分:1)

您正在请求中发送带有preambleCRLF和postambleCRLF的多部分消息,这会导致这些行。

您应该使用pkgcloud库将数据上传到Object Storage:

https://github.com/pkgcloud/pkgcloud

以下是在Bluemix上使用pkgcloud和Object Storage服务的示例(来自VCAP的凭据)。

(function (module) {
    var pkgcloud = require('pkgcloud'),
        fs = require('fs');

    function ObjectStorage(container, credentials) {
        this.container = container;

        this.config = {
            provider: 'openstack',
            useServiceCatalog: true,
            useInternal: false,
            keystoneAuthVersion: 'v3',
            authUrl: credentials.auth_url,
            tenantId: credentials.projectId,
            domainId: credentials.domainId,
            username: credentials.username,
            password: credentials.password,
            region: credentials.region
        };

        this.client = pkgcloud.storage.createClient(this.config);
    }

    ObjectStorage.prototype.validate = function () {
        return new Promise(function (resolve, reject) {
            this.client.auth(function (error) {
                if (error) {
                    return reject(error);
                }

                resolve();
            });
        }.bind(this));
    };

    ObjectStorage.prototype.makeContainer = function () {
        return new Promise(function (resolve, reject) {

            this.client.createContainer({name: this.container}, function (error) {
                if (error) {
                    return reject(error);
                }

                return resolve();
            });

        }.bind(this));
    };

    ObjectStorage.prototype.uploadFile = function (path, name) {
        return new Promise(function (resolve, reject) {

            var myPicture = fs.createReadStream(path);

            var upload = this.client.upload({
                container: this.container,
                remote: name
            });

            upload.on('error', function (error) {
                reject(error);
            });

            upload.on('success', function (file) {
                resolve(file);
            });

            myPicture.pipe(upload);
        }.bind(this));
    };

    module.exports = ObjectStorage;
})(module);

答案 1 :(得分:0)

由于使用multipart发送数据,我得到了那些行。我找到了一个解决方案,只添加内容类型,内容长度并在正文中发送数据,即

var options = {
    url: 'https://dal.objectstorage.open.softlayer.com/v1/AUTH_' + config.objectStorage.projectId + '/nrich-storage/' + file,
    method: 'PUT',
    headers: {
      'Content-Type': 'text/csv',
      'Content-Length': csv.length,
      'X-Auth-Token': authToken
    },
    body:csv
  };

  function callback(error, response) {
    if (error) cb(error);
    if (!error && response.statusCode == 201) {
      cb(null);
    }
  }

request(options, callback);