为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Google Drive API Node js 上传文件时文件名是“无标题”

使用 Google Drive API Node js 上传文件时文件名是“无标题”

凤凰求蛊 2022-12-09 13:58:52
我想将文件上传到 Google 云端硬盘,但上传的文件没有文件名。它作为“无标题”文件上传。如果可行,请给我一个解决方案,然后我接受你的回答这里有人对此有解决方案吗?提前致谢。这是我的代码。userController.uploadToDrive = function(req, res){    token = req.body.token;    console.log(token);    var formData = new FormData();    console.log(token);    var fileMetadata = {        'name': 'all.vcf'      };          formData.append("data",fs.createReadStream('./all.vcf'), "all.vcf");    request({        headers: {                      'Authorization': token,            'Content-Type' :'text/x-vcard',        },        resource: fileMetadata,        uri: 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',        body: formData,         filename:'all.vcf',        method: 'POST'    }, function (err, resp, body) {            if(err){                    console.log(err);        }else{            console.log('resp',body);            res.status(200).send()            fs.readdir('./contacts', function (err, files) {                var removefiles = function (file) {                    fs.unlinkSync('./contacts/' + file)                }                files.forEach(function (file) {                    removefiles(file)                })            })        }    });}它的回应是这样的:resp { "kind": "drive#file", "id": "1tXu9Fc4sdi-yk8QGGvMJqSgxLXhuXNhQ", "name": "Untitled", "mimeType": "text/x-vcard"}
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

我相信你的目标和情况如下。

  • 您想要使用 Drive API 将文件上传到 Google Drive multipart/form-data

  • 您的访问令牌可用于将文件上传到 Google 云端硬盘。

我认为在您的情况下,元数据和文件内容不能上传为multipart/form-data. 这样,文件元数据就无法反映到上传的文件中。所以为了实现这一点,我想提出以下修改。

模式 1:

在此模式中,const request = require("request")使用。

修改脚本:

const fs = require("fs");

const request = require("request");



token = req.body.token;

fs.readFile("./all.vcf", function (err, content) {

  if (err) {

    console.error(err);

  }

  const metadata = {

    name: "all.vcf",

    mimeType: "text/x-vcard"

  };

  const boundary = "xxxxxxxxxx";

  let data = "--" + boundary + "\r\n";

  data += 'Content-Disposition: form-data; name="metadata"\r\n';

  data += "Content-Type: application/json; charset=UTF-8\r\n\r\n";

  data += JSON.stringify(metadata) + "\r\n";

  data += "--" + boundary + "\r\n";

  data += 'Content-Disposition: form-data; name="file"\r\n\r\n';

  const payload = Buffer.concat([

    Buffer.from(data, "utf8"),

    Buffer.from(content, "binary"),

    Buffer.from("\r\n--" + boundary + "--\r\n", "utf8"),

  ]);

  request(

    {

      method: "POST",

      url:

        "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",

      headers: {

        Authorization: token,

        "Content-Type": "multipart/form-data; boundary=" + boundary,

      },

      body: payload,

    },

    function (err, resp, body) {


      if(err){

        console.log(err);

      }else{

        console.log('resp',body);

        res.status(200).send()

        fs.readdir('./contacts', function (err, files) {

            var removefiles = function (file) {

                fs.unlinkSync('./contacts/' + file)

            }

            files.forEach(function (file) {

                removefiles(file)

            })

        })

      }

    }

  );

});

模式 2:

在此模式中,使用节点提取。在您的脚本中,new FormData()使用了。所以我认为这种模式可能是你期望的方向。


修改脚本:

const FormData = require("form-data");

const fetch = require("node-fetch");

const fs = require("fs");



token = req.body.token;

var formData = new FormData();

var fileMetadata = {

  name: "all.vcf",

  mimeType: "text/x-vcard",

};

formData.append("metadata", JSON.stringify(fileMetadata), {

  contentType: "application/json",

});

formData.append("data", fs.createReadStream("./all.vcf"), {

  filename: "all.vcf",

});

fetch(

  "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",

  { method: "POST", body: formData, headers: { Authorization: token } }

)

  .then((res) => res.json())

  .then((json) => console.log(json))

查看完整回答
反对 回复 2022-12-09
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信