谷歌硬盘可恢复上传与javascript

谷歌硬盘可恢复上传与javascript,javascript,google-drive-api,Javascript,Google Drive Api,我正在尝试使用和将文件上载到Google Drive 我成功地进行了身份验证并获得了上传URI,但在发送实际数据时遇到了问题。如果文件仅包含ASCII字符,则文件将成功发送到驱动器,但如果是特殊字符(åäö)或二进制文件(如PNG),则文件将损坏。我的猜测是,在这个过程中的某个地方,文件在客户端被编码为unicode 如果我使用“btoa()”将原始数据编码到base64,并将标题“Content Encoding:base64”添加到数据发送请求中,则文件可以正常上载。但是,使用此方法会增加3

我正在尝试使用和将文件上载到Google Drive

我成功地进行了身份验证并获得了上传URI,但在发送实际数据时遇到了问题。如果文件仅包含ASCII字符,则文件将成功发送到驱动器,但如果是特殊字符(åäö)或二进制文件(如PNG),则文件将损坏。我的猜测是,在这个过程中的某个地方,文件在客户端被编码为unicode

如果我使用“btoa()”将原始数据编码到base64,并将标题“Content Encoding:base64”添加到数据发送请求中,则文件可以正常上载。但是,使用此方法会增加33%的开销,当计划上载的文件大小为100MB到1GB时,这是相当大的开销

以下是一些代码示例:

正在获取可恢复的上载URI:

// Authentication is already done
var request = gapi.client.request({
    "path": DRIVE_API_PATH, // "/upload/drive/v2/files"
    "method": "POST",
    "params": {
        "uploadType": "resumable"
    },
    "headers": {
        "X-Upload-Content-Type": self.file.type,
        //"X-Upload-Content-Length": self.file.size
        // If this is uncommented, the upload fails because the file size is
        // different (corrupted file). Manually setting to the corrupted file
        // size doesn't give 400 Bad Request.
    },
    "body": {
        // self.file is the file object from <input type="file">
        "title": self.file.name, 
        "mimeType": self.file.type,
        "Content-Lenght": self.file.size,
    }
});

我错过什么了吗?可以以二进制流上传文件吗?我不熟悉用HTML和Javascript上传文件,我还没有发现任何使用谷歌Javascript库的例子。因此没有答案。

Blob类型是
XMLHttpRequest
实现的热门话题,它们还没有真正成熟。我建议您坚持使用base64编码。谷歌的JavaScript客户端库不支持可恢复上传,因为客户端浏览器应用程序不太可能直接将非常大的文件上传到谷歌硬盘。

什么有效 要上传二进制blob,请使用github/googleapi's或use,这将为您从gapi客户端获取
访问\u令牌

这是一个丑陋的承诺和回调代码的混合体,对我来说很有效。作为先决条件,
gapi
UploaderForGoogleDrive
JSZip
需要通过
标记加载。该代码段还省略了gapi初始化和API机密,这也是必需的

function bigCSV(){  // makes a string for a 300k row CSV file
    const rows = new Array(300*1000).fill('').map((v,j)=>{
      return [j,2*j,j*j,Math.random(),Math.random()].join(',');
    });
    return rows.join("\n");
}

function bigZip(){  // makes a ZIP file blob, about 8MB
    const zip = new window.JSZip();
    zip.folder("A").file("big.csv", bigCSV());
    return zip.generateAsync({type:"blob", compression:"DEFLATE"});
    // returns Promise<blob>
}

function upload2(zipcontent){
   'use strict';
    const parent = 'root';
    const spaces = 'drive';
    const metadata = {
      name: 'testUpload2H.zip',
      mimeType: 'application/zip',
      parents: [parent]
    };
    const uploader = new window.UploaderForGoogleDrive({
      file: zipcontent,
      metadata: metadata,
      params: {
        spaces,
        fields: 'id,name,mimeType,md5Checksum,size'
      },
      onProgress: function(x){
         console.log("upload progress:",Math.floor(100*x.loaded/x.total));
      },
      onComplete: function(x){
        if (typeof(x)==='string') x = JSON.parse(x);
        // do something with the file metadata in x
        console.log("upload complete: ");
      },
      onError: function(e){ console.log("upload error: ",e); }
    });
    uploader.upload();
}

function uploadZipFile(){
    'use strict';
    (bigZip()
      .then(upload2)
    );
}
函数bigCSV(){//为一个300k行的CSV文件生成一个字符串
常量行=新数组(300*1000)。填充(“”)。映射((v,j)=>{
返回[j,2*j,j*j,Math.random(),Math.random()].join(',');
});
返回行。连接(“\n”);
}
函数bigZip(){//生成一个ZIP文件blob,大约8MB
const zip=new window.JSZip();
zip.folder(“A”).file(“big.csv”,bigccsv());
返回zip.generateAsync({type:“blob”,compression:“DEFLATE”});
//回报承诺
}
函数上传2(zipcontent){
"严格使用",;
const parent='根';
常量空间='drive';
常量元数据={
名称:“testUpload2H.zip”,
mimeType:“应用程序/zip”,
家长:[家长]
};
const uploader=new window.UploaderForGoogleDrive({
文件:zipcontent,
元数据:元数据,
参数:{
空间,
字段:“id、名称、mimeType、md5Checksum、大小”
},
onProgress:功能(x){
控制台日志(“上传进度:”,数学楼层(100*x.loaded/x.total));
},
未完成:函数(x){
if(typeof(x)='string')x=JSON.parse(x);
//对x中的文件元数据执行一些操作
日志(“上传完成:”);
},
onError:function(e){console.log(“上传错误:,e);}
});
uploader.upload();
}
函数uploadZipFile(){
"严格使用",;
(bigZip()
.然后(上传2)
);
}
什么不起作用 截至2017年11月,使用
gapi.client.request
调用上载二进制blob将无法工作,因为


我还尝试将base64与
gapi
一起使用,效果很好。但存放的是base64文件,而不是真正的二进制文件;还有cors模式下的fetch API,它工作了一半,但产生了与cors相关的错误和响应隐藏,至少对我来说是这样。

很有趣。这仍然是真的吗?2017年7月。我有一个在浏览器中生成模拟数据的应用程序,我更希望浏览器直接上传一个zip文件给最终用户驱动。我在浏览器中获得了一个可恢复上传的
text/csv
文件后发现了这篇文章。我成功地使用Jani提到的两部分技术将一个62MB
text/csv
文件从浏览器中的循环和公式生成,并将其放入驱动器。尚未尝试zip文件,但很快就会尝试。我们正在制作一个视频网站,希望将数据保存到google drive。如果我们不直接上传到谷歌硬盘,我们将不得不先上传到我们的服务器上,这对我们来说是一件非常可怕的事情。所以,应该有办法直接上传大文件。这些信息对你的情况有用吗?这是一个Javascript库,用于实现Google Drive的可恢复上传。
function bigCSV(){  // makes a string for a 300k row CSV file
    const rows = new Array(300*1000).fill('').map((v,j)=>{
      return [j,2*j,j*j,Math.random(),Math.random()].join(',');
    });
    return rows.join("\n");
}

function bigZip(){  // makes a ZIP file blob, about 8MB
    const zip = new window.JSZip();
    zip.folder("A").file("big.csv", bigCSV());
    return zip.generateAsync({type:"blob", compression:"DEFLATE"});
    // returns Promise<blob>
}

function upload2(zipcontent){
   'use strict';
    const parent = 'root';
    const spaces = 'drive';
    const metadata = {
      name: 'testUpload2H.zip',
      mimeType: 'application/zip',
      parents: [parent]
    };
    const uploader = new window.UploaderForGoogleDrive({
      file: zipcontent,
      metadata: metadata,
      params: {
        spaces,
        fields: 'id,name,mimeType,md5Checksum,size'
      },
      onProgress: function(x){
         console.log("upload progress:",Math.floor(100*x.loaded/x.total));
      },
      onComplete: function(x){
        if (typeof(x)==='string') x = JSON.parse(x);
        // do something with the file metadata in x
        console.log("upload complete: ");
      },
      onError: function(e){ console.log("upload error: ",e); }
    });
    uploader.upload();
}

function uploadZipFile(){
    'use strict';
    (bigZip()
      .then(upload2)
    );
}