我在使用官方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) {
答案 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');