如何使用dropbox.js将文件上传到Dropbox?

时间:2012-11-01 17:16:14

标签: javascript node.js dropbox-api

ORIGINAL

我在使用官方dropbox.js从 Node.js 上传文件(图片)到Dropbox时遇到问题。 我想上传我在另一台服务器上的图片。例如使用dropbpox图标(www.dropbox.com/static/images/new_logo.png)。

client.writeFile(file, 'www.dropbox.com/static/images/new_logo.png', function(error, stat) {
 if (error) {
  return es.send(error.status);  // Something went wrong.
 }

 res.send("File saved as revision " + stat.revisionTag);
});

我知道这只会创建一个包含网址的文本文件,但是如何将图片上传到Dropbox? 我也尝试使用http.get下载该文件,然后将其上传到Dropbox但它不起作用。

感谢。

更新信息

首先,我使用以下代码从远程网址下载图像:

var request = http.get(options, function(res){
        var imagedata = ''
        res.setEncoding('binary')

        res.on('data', function(chunk){
            imagedata += chunk
        }) 

        res.on('end', function(){ 
            console.log("Image downloaded!");

            fs.writeFile(local, imagedata, 'binary', function(err){
              if (err) throw err
              console.log('File saved.')
            })
        })
    })

文件已正确保存。 然后我转向事物:

将'imagedata'发送到Dropbox:

  console.log("Image downloaded!");

            client.writeFile(file, imagedata, function(error, stat) {
                if (error) {
                    return response.send(error.status);  // Something went wrong.
                }

                response.send("File saved as revision " + stat.revisionTag);
            });

有些内容会上传到Dropbox,但没什么用处。

然后我也尝试从光盘读取文件,然后将其发送到Dropbox,但它既不起作用:

fs.readFile(file, function(err, data) {

2 个答案:

答案 0 :(得分:3)

使用dropbox-js 0.9.1-beta1或更高版本从node.js上传二进制文件。您需要传递Buffer或ArrayBuffer实例。试试这段代码:

var req = http.get(options, function(res) {
  var chunks = [];

  res.on('data', function(chunk) {
    chunks.push(chunk);
  });

  res.on('end', function() {
    console.log("Image downloaded!");

    var imageData = Buffer.concat(chunks);
    client.writeFile(file, imageData, function(error, stat) {
      if (error) {
        return response.send(error.status);
      }
      response.send("File saved as revision " + stat.revisionTag);
    });
  });
});

```

原始答案:dropbox-js README提到二进制文件尚未在node.js中起作用。

答案 1 :(得分:0)

我也有问题,我只是在旧的dropbox-node npm上复制并修改了一下(现已弃用),但我在dropbox.js上添加了以下功能。

Client.prototype.writeFileNodejs = function(path, data, callback) {
  var self = this;
  fs.readFile(data.path, function(err, data) {
    if (err) return callback(err);
    var uri = "" + self.urls.putFile + "/" + (self.urlEncodePath(path));

    if (typeof data === 'function') callback = data, data = undefined;
    var oauth = {
      consumer_key: self.oauth.key
    , consumer_secret: self.oauth.secret
    , token: self.oauth.token
    , token_secret: self.oauth.tokenSecret
    };

    var requestOptions = { uri: uri, oauth: oauth };
    requestOptions.body = data;

    return request['put'](requestOptions, callback ?
      function(err, res, body) {
        if (err) return callback(err);
        var contentType = res.headers['content-type'];

        // check if the response body is in JSON format
        if (contentType === 'application/json' ||
            contentType === 'text/javascript') {
          body = JSON.parse(body);
          if (body.error) {
            var err = new Error(body.error);
            err.statusCode = res.statusCode;
            return callback(err);
          }

        } else if (errors[res.statusCode]) {
          var err = new Error(errors[res.statusCode]);
          err.statusCode = res.statusCode;
          return callback(err);
        }

        // check for metadata in headers
        if (res.headers['x-dropbox-metadata']) {
          var metadata = JSON.parse(res.headers['x-dropbox-metadata']);
        }

        callback(null, body, metadata);
      } : undefined);
  });
};

你也想要请求和fs来做这件事。

var request = require('request'),
    fs = require('fs');