Laravel从浏览器下载的文件已损坏

时间:2018-05-04 02:04:36

标签: javascript php laravel vue.js

我正在尝试下载s3中保存的文件。所以我有如下代码。

mongodump --host mongodb1.example.net --port 3017 --username user --password "pass" --out /opt/backup/mongodump-2013-10-24

我有如下的javascript代码。

static public function download($key, $disk = 's3') : object
{

    $file = FileHelper::get($key);

    $local = Storage::disk('local');
    $local->put(basename($key), $file);
    $pathToFile = storage_path().'/app/'.basename($key);

    $headers = [
        'Content-Type' => \GuzzleHttp\Psr7\mimetype_from_filename(basename($key)),
        'Content-Description' => 'File Transfer',
        'Content-Disposition' => "attachment; filename=' ". basename($key),
        'filename'=> basename($key)
    ];

    $repsonse = response()->download($pathToFile, basename($key), $headers)->deleteFileAfterSend(true);
    ob_end_clean();

    return $repsonse;
}

文件已下载,但文件已损坏。 (它不会打开)我检查了S3存储桶以查看文件在上传过程中是否已损坏,但它在那里很好。

我做错了什么?任何建议或意见将不胜感激。

提前谢谢。

补充:当我尝试查看图像时,它返回白色方块,这意味着它的base64编码图像。是否与空文件有关?

1 个答案:

答案 0 :(得分:0)

我必须使用标准XMLHttpRequest来完成下面的操作。

downloadFile() {

            var app = this;
            var url = baseRoute + 'files/' + this.fileId + '/download';
            var xhr = new XMLHttpRequest();
            xhr.open("POST", url);
            xhr.setRequestHeader('Authorization', 'bearer ' + this.Authentication.tokenData().token);
            xhr.responseType = "arraybuffer";

            xhr.onload = function () {

                if (this.status === 200) {

                    var today = ((new Date()).toISOString()).slice(2,10),
                        filename = today.replace(/-/gi, "")+' '+ app.fileTitle;

                    var blob = new Blob([xhr.response], {type: xhr.getResponseHeader('content-type')});
                    var objectUrl = URL.createObjectURL(blob);

                    let link = document.createElement('a');
                    link.href = objectUrl;
                    link.download = filename;
                    link.click();
                    window.URL.revokeObjectURL(blob);
                }
            };
            xhr.send();
        },