我一直在尝试使用nodejs后端中的dropbox API v2将图像上传到dropbox应用程序文件夹,但是成功上传的每个图像都已损坏,并且只有15个字节大,无法在dropbox应用程序文件夹中进行预览。
这是我的代码;
const express = require("express");
const router = express.Router();
const fetch = require("isomorphic-fetch");
const Dropbox = require("dropbox").Dropbox;
const dbx = new Dropbox({
accessToken:
"my access token",
fetch: fetch
});
router.post("/dbx", (req, res) => {
let imageArray;
//I receive either a single image or an array of images from the front end and
//its placed in req.files by express-fileupload
if (req.files.itemImage.length) {
imageArray = [...req.files.itemImage];
} else {
imageArray = [req.files.itemImage];
}
imageArray.forEach(image => {
console.log("Image==>>",image)
dbx
.filesUpload({
path: `/${image.name}`,
contents: image
})
.then(response => {
console.log(response);
})
.catch(err => {
console.log(err);
});
});
});
下面是我要发送的典型图像,该图像来自终端中的命令console.log("Image==>>",image)
{ name: 'ImageName.jpg',
data:
<Buffer ff d8 ff e1 1f 39 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 07 01 12 00 03 00 00 00 01 00 01 00 00 01 1a 00 05 00 00 00 01 00 00 00 62 01 1b 00 05 ... >,
size: 1865542,
encoding: '7bit',
tempFilePath: '',
truncated: false,
mimetype: 'image/jpeg',
md5: '133bda2ce6d52b4bada8ba31349c4910',
mv: [Function: mv] }
以下是我从终端上的保管箱收到的回复
{ name: 'ImageName.jpg',
path_lower: '/imageName.jpg',
path_display: 'ImageName.jpg',
id: 'id:R0fPv_de0wAAAAAAAAAAJw',
client_modified: '2019-07-08T10:21:36Z',
server_modified: '2019-07-08T10:21:36Z',
rev: '0130000000015cb7a8c0',
size: 15,
is_downloadable: true,
content_hash:
'87bfbb905f228845cfb691920551882f446042da2ef9576e26ca97c5374c3eef' }
图像名称正确显示在name:
字段中,但是图像只有15个字节,无法在Dropbox应用程序文件夹中预览。我不明白发生了什么问题,因此不知道如何解决。谁能帮我解释我做错了什么吗?如果不清楚我的问题,请指出来,我会进行相应的编辑。
我尝试以JSON.stringify(image)
的形式发送请求的内容,并得到了比发送的文件大3倍的损坏文件,我看到了一种方法,必须首先将图像上传到服务器上的文件夹中然后使用fs命令将每个内容写入请求,但是我不想在服务器上有这样的文件夹,我宁愿在可能的情况下立即发送图像。
我希望收到来自保管箱服务器的肯定消息,其中包含正确的图像大小,然后可以在我创建的保管箱应用程序文件夹中预览图像。
答案 0 :(得分:0)
我自己弄清楚了。仅在万一有人遇到相同问题的情况下发布。 内容应从image更改为image.data
即不这样做;
dbx
.filesUpload({
path: `/${image.name}`,
contents: image
})
.then(response => {
console.log(response);
})
.catch(err => {
console.log(err);
});
应该是这个
dbx
.filesUpload({
path: `/${image.name}`,
contents: image.data
})
.then(response => {
console.log(response);
})
.catch(err => {
console.log(err);
});
答案 1 :(得分:0)
将其发布为供将来搜索者参考,因为我也很难理解这一点。如果可以改进此解释,欢迎发表评论。
Dropbox的/files/upload端点需要文件的二进制数据(除其他外)。在服务器端JavaScript领域,Buffer
类是Node处理二进制数据的方式。尽管有时您可以在请求或响应中发现文件的二进制数据(Buffer
对象),但Buffer
类还提供了多种方法来使您自己的Buffer
对象成为对象。何时需要文件。
我发现this article about Buffers from FreeCodeCamp是有用的资源。