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

我想将文件上传到 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"

}


凤凰求蛊
浏览 87回答 1
1回答

白衣非少年

我相信你的目标和情况如下。您想要使用 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript