使用选择器从谷歌驱动器下载的文件已损坏

时间:2014-05-02 08:17:25

标签: javascript php google-drive-api google-picker

我在我的网络应用中使用谷歌选择器允许用户浏览并从他的谷歌驱动器中选择文件。一旦他做出选择,选择器就会返回有关所选文件的各种数据,包括文件ID和URL。我的目标是将所选文件下载到服务器。如果我将URL传递给我的后端脚本,它下载文件但是它们已损坏,这是我的代码:

回调函数:

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();
    }
}

这是将数据发送到我的php文件的函数:

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);
}

这是我的php函数下载文件:


        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();

有关我如何在不破坏文件的情况下下载文件的任何想法?

0 个答案:

没有答案