php 无法从 AJAX 请求的方法下载文件

tp5buhyn  于 2023-01-12  发布在  PHP
关注(0)|答案(3)|浏览(138)

该方法创建一个zip文件并下载它。该文件在storage/app/public文件夹中创建(我运行php artisan storage:link创建了一个符号链接),但它不下载。

public function download()
{
    $zip_file = 'screenshots.zip';
    $zip_path = storage_path('app/public/'.$zip_file);
    $zip = new \ZipArchive();
    $zip->open($zip_path, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);

    $path = storage_path('app/public/screenshots');
    $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
    foreach ($files as $name => $file) {
        if ($file->isDir()) {
            continue;
        }

        $filePath = $file->getRealPath();
        $relativePath = 'screenshots/' . substr($filePath, strlen($path) + 1);
        $zip->addFile($filePath, $relativePath);
    }

    $zip->close();

    return response()->download($zip_path);
}

JS系统

function downloadImages() {
    const token = document.querySelector('meta[name="csrf-token"]').content;

    fetch('/download', {
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json, text-plain, */*',
            'X-Requested-With': 'XMLHttpRequest',
            'X-CSRF-TOKEN': token
        },
        method: 'get',
    })
        .then((response) => {
            console.log('download');
        })
        .catch((error) => {
            console.log(error);
        })
}
sqserrrh

sqserrrh1#

下载无法正常工作的原因可能有多种。

1.一个可能的原因是文件路径不正确。请检查以确保zip文件的路径正确,并且该文件位于正确的目录中。
1.另一种可能是download函数配置不正确,确保函数返回一个响应对象,而不是字符串,并且传递给download函数的路径是正确的,在本例中应该是response()-〉download($zip path)
1.如果您使用的是Web服务器,请确保将其设置为允许下载,并且文件的权限设置正确。
1.如果文件没有正确关闭,则存在另一种可能性,要排除这种可能性,请尝试调用**$zip-〉close();**在响应之前。
你可以尝试使用var dump来查看这个函数是否返回了任何东西,看看它是否能帮助你找到问题所在,你也可以查看你的web服务器的错误日志。

lp0sw83n

lp0sw83n2#

对于客户端浏览器的跨平台下载,您可以使用php echo string:

echo "Here is your download link: " . "<a id="photos_collection" href='". $zip_path ."' download='". $zip_file ."'>". $zip_file . " (" . filesize_formatted($zip_path) . ")" ."</a>";

日本
r是一个div,用于接收responseText形式的响应:

$("#r").html(this.responseText); $("#photos_collection").click();

$("#r").html(response); $("#photos_collection").click();
brjng4g3

brjng4g33#

修复!APP_URL设置不正确。
我还将JS方法更改为:

function downloadImages() {
  window.location = '/download';
}

谢谢@pathum-bandara

相关问题