2016-01-06 13 views
5

W mojej aplikacji internetowej użytkownicy mogą przesyłać pliki. Przed zapisywane i przechowywane, zawartość pliku są szyfrowane za pomocą czegoś takiego:Praca z zaszyfrowanymi plikami w Laravel (jak pobrać odszyfrowany plik)

Crypt::encrypt(file_get_contents($file->getRealPath())); 

Następnie używać systemu plików, który pochodzi z laravel przenieść plik

Storage::put($filePath, $encryptedFile); 

Mam tabeli do przechowywania informacji o każdym pliku z kolumnami takimi jak:

  • id
  • FILE_PATH
  • nazwa_pliku
  • original_name (obejmuje rozszerzenie)

teraz chcę użytkownika, aby móc pobrać ten plik zaszyfrowany. Mam jednak problem z odszyfrowaniem pliku i zwróceniem go użytkownikowi. W file downloads response section dokumentacji laravel, sugeruje, aby to zrobić:

return response()->download($pathToFile, $name, $headers); 

Chce ścieżkę do pliku, który jest w porządku, ale w tym momencie mogę odszyfrować zawartość pliku tak, że to jest rzeczywiście czytelne?

I nie wydają się być w stanie to zrobić:

$encryptedContents = Storage::get($fileRecord->file_path); 
$decryptedContents = Crypt::decrypt($encryptedContents); 

... ale nie wiem jak przywrócić go do pobrania z określoną nazwą pliku.

Odpowiedz

8

Można ręcznie utworzyć odpowiedź jak tak:

$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) . '"' 
)); 

Można sprawdzeniu Laravel API uzyskać więcej informacji na temat tego, co parametry metody make są. Funkcja pathinfo służy również do wyodrębnienia nazwy pliku ze ścieżki, aby wysłać prawidłową nazwę pliku z odpowiedzią.

+0

Jesteś czarodziejem! Dziękuję Ci! W moim przypadku, gdy plik jest zapisany, jest on faktycznie nazwany z 32-bitowym typem wartości md5, ale zachowuję zapis oryginalnej nazwy pliku, włącznie z rozszerzeniem pliku. Więc jeśli masz 'pathinfo ($ fileRecord-> ścieżka_pliku, PATHINFO_BASENAME)', po prostu mam '$ fileRecord-> original_name' i to też działa dobrze. Dzięki jeszcze raz. – Marcel

+0

Chociaż dla zapisu, w mojej metodzie jest komunikat ostrzegawczy na konsoli (przynajmniej w przeglądarce Chrome): 'Zasób interpretowany jako Dokument, ale przesłany z aplikacją typu MIME/strumień-oktetu:' ale nadal działa poprawnie. – Marcel

+0

Możesz naprawić to ostrzeżenie, używając ['finfo :: buffer'] (http://php.net/manual/ro/function.finfo-buffer.php), aby uzyskać typ mime pliku z odszyfrowanego ciągu znaków (zakładając, że informacje zostały zaszyfrowane wraz z zawartością) i przekazując je wraz z odpowiedzią. Zaktualizowałem swoją odpowiedź, aby to uwzględnić. – Bogdan