1

オリジナル

公式の 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);
});

URL を含むテキスト ファイルしか作成されないことはわかっていますが、画像を Dropbox にアップロードするにはどうすればよいですか? また、http.get を使用してファイルをダウンロードしてから、これを Dropbox にアップロードしようとしましたが、うまくいきません。

ありがとう。

詳細情報を更新

まず、次のコードを使用してリモート 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 に答える