1

原来的

我在使用官方 dropbox.js从Node.js将文件(图像)上传到 Dropbox 时遇到问题。我想上传我在另一台服务器上的图片。例如使用 dropbbox 图标 (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);
});

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

谢谢。

更新更多信息

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

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.')
            })
        })
    })

文件已正确保存。然后我尝试做一些事情:

将“图像数据”发送到 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) {
4

2 回答 2

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 中还不能工作。

于 2012-11-26T03:52:46.463 回答
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);
  });
};

您也想要求 request 和 fs 来做到这一点。

var request = require('request'),
    fs = require('fs');
于 2013-01-11T21:58:53.867 回答