问题
I'm using google picker in my web app to allow user to browse and select files from his google drive. Once he makes the selection, picker returns various data about selected files, including file ID and URL. My goal is to download the selected files to the server. If I pass the URL to my backend script, it download file but they are corrupted here is my code :
callback function :
function onPickerAction(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();
}
}
this is the function that send data to my php file :
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 = [url, title, type, filesize, fileext,id];
document.getElementById("myddlink").href=link;
request.open("POST", "downloadfile.php?" + datatable, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.send("datatable=" + datatable);
}
and this is my php function to download files :
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 . '/Myfiles1/' . $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-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 . '/Myfiles1/'; $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();
any ideas please about how can i download files without corrupting them ?
来源:https://stackoverflow.com/questions/23423671/files-downloaded-from-google-drive-usin-picker-are-corrupted