google files activate javascript php ajax google-drive-sdk google-picker

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.