簡體   English   中英

使用php下載xlsx文件

[英]Download xlsx file using php

我需要從我的網站下載xlsx文件(但不是像這樣直接打開文件網址: http://site.com/file.xlsx : http://site.com/file.xlsx

所以,這是php代碼

        $file = "somefile.xlsx";
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);

文件已下載,他的擴展名是.xlsx ,但是當嘗試在 ms excel 中打開此文件時,文件未打開並且出現錯誤: excel cannot open the file.xlsx because the file format or file extension is not valid

請告訴,為什么會這樣? 我錯在哪里?

多年后,我遇到了同樣的問題,經過搜索,我再次來到這里 ))

這是解決方案,對我有用:

$file = "somefile.xlsx";
// define file $mime type here
ob_end_clean(); // this is solution
header('Content-Description: File Transfer');
header('Content-Type: ' . $mime);
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . basename($file) . "\"");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($file);

您必須在其他文件中間使用此代碼。

標題的問題是它們需要首先在頁面上設置。 如果您在它們之前甚至有 1 個空格回響,它們將無法工作。 所以你需要在設置標題之前 ob_clean() [清理緩沖區]

嘗試

    ob_clean();
    flush();
    $file = "somefile.xlsx";
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);

消除:

ob_clean();
flush();

在代碼末尾添加:

exit();

問題是,flush() 也會在你的 *.xlsx 文件內容中拋出一些垃圾,這會破壞你的文件,即使你使用 ob_clean();

為了更好地理解,請訪問 php.net 並閱讀 flush() 和 ob_flush() 之間的區別,並發現在第一種情況下您甚至不需要它們。 因此,您也不需要 ob_clean()。

這對我有用:

    header('Content-Description: File Transfer');
    header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    header("Content-Disposition: attachment; filename=\"".basename($fileLocation)."\"");
    header("Content-Transfer-Encoding: binary");
    header("Expires: 0");
    header("Pragma: public");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Length: ' . filesize($fileLocation)); //Remove

    ob_clean();
    flush();

    readfile($fileLocation);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM