Laravel Загруженный файл из браузера поврежден - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь скачать файл, сохраненный в s3. Так что у меня есть коды, как показано ниже.

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

И у меня есть код JavaScript, как показано ниже.

downloadFile() {
            var app = this;

            var url = baseRoute + 'files/' + this.fileId + '/download';
            axios.get(url, {
                headers: {
                    Authorization: 'bearer ' + this.Authentication.tokenData().token,
                    responseType : "blob"
                }
            }).then(function (response) {

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

                let blob = new Blob([response.data], {
                    type: response.headers['content-type']
                });

                let link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.download = filename;
                link.click();

            }).catch(function (response) {
                console.log(response);
            });
        }

Файл загружен, однако файл поврежден. (он не открывается) Я проверил S3 bucket, чтобы увидеть, не поврежден ли файл во время загрузки, но там все было в порядке.

Что я делаю не так? Любой совет или предложение будут оценены.

Заранее спасибо.

Добавлено: когда я пытался просмотреть изображение, оно возвращало белый квадрат, что означает его изображение в кодировке base64. Связано ли это с пустым файлом?

1 Ответ

0 голосов
/ 08 мая 2018

Мне пришлось использовать стандарт 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();
        },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...