В моем webapp пользователи могут загружать файлы. Перед сохранением и сохранением содержимое файла зашифровывается с помощью следующего:
Crypt::encrypt(file_get_contents($file->getRealPath()));
Затем я использую файловую систему, которая поставляется с Laravel для перемещения файла
Storage::put($filePath, $encryptedFile);
У меня есть таблица для хранения информации о каждом файле с такими столбцами, как:
Теперь я хочу, чтобы пользователь мог загрузить этот зашифрованный файл. Однако у меня возникли проблемы с расшифровкой файла и возвратом его пользователю. В разделе ответов на загрузку файлов документации Laravel предлагается сделать следующее:
return response()->download($pathToFile, $name, $headers);
Он хочет, чтобы путь к файлу был прекрасным, но в какой момент я могу расшифровать содержимое файла, чтобы оно было действительно читаемым?
Кажется, я могу это сделать:
$encryptedContents = Storage::get($fileRecord->file_path); $decryptedContents = Crypt::decrypt($encryptedContents);
… но я не знаю, как вернуть его как загрузку с указанным именем файла.
Вы можете вручную создать ответ так:
$encryptedContents = Storage::get($fileRecord->file_path); $decryptedContents = Crypt::decrypt($encryptedContents); return response()->make($decryptedContents, 200, array( 'Content-Type' => (new finfo(FILEINFO_MIME))->buffer($decryptedContents), 'Content-Disposition' => 'attachment; filename="' . pathinfo($fileRecord->file_path, PATHINFO_BASENAME) . '"' ));
Вы можете проверить API Laravel для получения дополнительной информации о параметрах метода make
. Функция pathinfo
также используется для извлечения имени файла из пути, поэтому он отправляет правильное имя файла с ответом.