files - Descargue el archivo de Google Drive usando javascript
upload file php google drive (1)
Quiero descargar el archivo de Google Drive usando Javascript a mi servidor cuando hago clic en el selector de Google Drive pero no puedo descargar el archivo. He estado buscando si durante 4 días pero el problema es el siguiente es el código que estoy usando.
function pickerCallback(data) {
if (data.action == google.picker.Action.PICKED) {
var id = data.docs[0].id;
var request = new XMLHttpRequest();
request.open(''GET'', ''https://www.googleapis.com/drive/v2/files/'' + id);
request.setRequestHeader(''Authorization'', ''Bearer '' + gapi.auth.getToken().access_token);
request.addEventListener(''load'', function() {
var item = JSON.parse(request.responseText);
console.log(item);
downloadFile(item);
});
request.send();
}
}
function downloadFile(item) {
var request = new XMLHttpRequest();
var mimeType = item[''mimeType''];
if (typeof item.exportLinks != ''undefined'') {
if (mimeType == ''application/vnd.google-apps.spreadsheet'') {
mimeType = ''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'';
}
url = item[''exportLinks''][mimeType];
link = url;
} else {
lien = item[''downloadUrl''].split("&");
link = lien[0] + ''&'' + lien[1];
url = item[''downloadUrl''];
}
title = item[''title''];
type = mimeType;
filesize = item[''fileSize''];
fileext = item[''fileExtension''];
id = item[''id''];
var datatable = $.param({ url: url, title: title, type: type, filesize: filesize, fileext: fileext, id: id});
request.open("POST", "ajax-db-files/copy_drive_file.php?" + datatable, true);
request.setRequestHeader(''Content-Type'', ''application/x-www-form-urlencoded'');
request.send("datatable=" + datatable);
}
y el archivo php es:
$upload_path=''sss'';
if (isset($_POST[''exportFormat''])) {
$pieces = explode(",", $_POST[''exportFormat'']);
$url = $_POST[''datatable''] . ''&exportFormat=xlsx'';
$title = $pieces[1];
$type = $pieces[2];
$fileext = $pieces[0];
$fileId = $pieces[5];
}else {
$url = $_POST[''datatable''] . ''&e=download'';
$pieces = explode(",", $_POST[''gd'']);
$onlytitle = explode(".", $pieces[1]);
$title = $onlytitle[0];
$type = $pieces[2];
$filesize = $pieces[3];
$fileext = $pieces[4];
$fileId = $pieces[5];
}
$fullPath = $upload_path.''/''.$title.''.''. $fileext;
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
//header("Content-type: " . $type . "");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=/"".$title.''.''.$fileext."/"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $filesize);
// folder to save downloaded files to. must end with slash
$destination_folder = $upload_path.''/'';
$newfname = $destination_folder . basename($title . ''.'' . $fileext);
$file = fopen($url, "rb");
if ($file) {
$newf = fopen($newfname, "wb");
if ($newf)
while (!feof($file)) {
fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
ob_end_flush();
TLDR;
datatable
debe serializar la datatable
en una cadena con codificación URL.
Explicación
var datatable = [url, title, type, filesize, fileext,id];
Aquí, estás creando datatable como una matriz
request.open("POST", "ajax-db-files/copy_drive_file.php?" + datatable, true);
request.send("datatable=" + datatable);
Luego, en estas dos líneas, intenta concatenar la matriz directamente a la cadena, que convierte la matriz en una cadena llamando a .join('','')
en la matriz.
Lo que necesita es serializar la matriz en notación codificada en URL. Si está utilizando jQuery, intente con var datatable = $.param({ url: url, title: title, type: type, filesize: filesize, fileext: fileext, id: id]);
en lugar.