it-roy-ru.com

Скачивайте файлы в laravel используя Response :: download

В приложении Laravel я пытаюсь получить вид изнутри кнопки, который позволяет пользователю загружать файл, не переходя ни к какому другому виду или маршруту Теперь у меня есть две проблемы: (1) ниже броска функции 

The file "/public/download/info.pdf" does not exist

(2) Кнопка «Загрузить» не должна перемещать пользователя в любое место, а просто загружать файлы в одном представлении, «Мои текущие настройки», перенаправляя представление в «/ download».

Вот как я пытаюсь достичь: 

Кнопка:

  <a href="/download" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a>

Маршрут:

Route::get('/download', '[email protected]');

Контроллер:

public function getDownload(){
        //PDF file is stored under project/public/download/info.pdf
        $file="./download/info.pdf";
        return Response::download($file);
}
49
star18bit

Попробуй это.

public function getDownload()
{
    //PDF file is stored under project/public/download/info.pdf
    $file= public_path(). "/download/info.pdf";

    $headers = array(
              'Content-Type: application/pdf',
            );

    return Response::download($file, 'filename.pdf', $headers);
}

"./download/info.pdf" не будет работать, так как вы должны указать полный физический путь.

Обновление 20/05/2016

Пользователи Laravel 5, 5.1, 5.2 или 5. * могут использовать следующий метод вместо Response фасад. Однако мой предыдущий ответ будет работать как для Laravel 4, так и для 5. (структура массива $header изменится на ассоциативный массив =>- двоеточие после «Content-Type» - если мы не сделаем эти изменения, заголовки будут добавлены в неправильный путь: имя заголовка будет числом, начинающимся с 0,1, ...)

$headers = [
              'Content-Type' => 'application/pdf',
           ];

return response()->download($file, 'filename.pdf', $headers);
115
Anam

В принятом ответе для Laravel 4 массив заголовков построен неправильно. Использование:

$headers = array(
  'Content-Type' => 'application/pdf',
);
26
sebt

Загрузка файлов очень проста в Laravel 5.

Как упомянул @Ashwani, Laravel 5 позволяет загрузки файлов с функцией response()->download() возвращать файл для загрузки. Нам больше не нужно связываться с любыми заголовками. Чтобы вернуть файл мы просто:

return response()->download(public_path('file_path/from_public_dir.pdf'));

изнутри контроллера.


Многоразовый маршрут загрузки/Контроллер

Теперь давайте создадим маршрут и контроллер загрузки файлов многократного использования, чтобы мы могли серверным способом любой файл в нашем каталоге public/files.

Создайте контроллер:

php artisan make:controller --plain DownloadsController

Создайте маршрут в app/Http/routes.php:

Route::get('/download/{file}', '[email protected]');

Сделайте метод загрузки в app/Http/Controllers/DownloadsController:

class DownloadsController extends Controller
{
  public function download($file_name) {
    $file_path = public_path('files/'.$file_name);
    return response()->download($file_path);
  }
}

Теперь просто отбрасываете некоторые файлы в каталог public/files, и вы можете настроить их, связавшись с /download/filename.ext:

<a href="/download/filename.ext">File Name</a> // update to your own "filename.ext"

Если вы загрузили Html-пакет Laravel Collective вы можете использовать Html-фасад:

{!! Html::link('download/filename.ext', 'File Name') !!}
24
DutGRIFF

Многие из этих решений предлагают ссылаться на public_path () приложения Laravel, чтобы найти файл. Иногда вам захочется контролировать доступ к файлу или предлагать мониторинг файла в режиме реального времени. В этом случае вы захотите сохранить каталог закрытым и ограничить доступ методом в классе контроллера. Следующий метод должен помочь с этим:

public function show(Request $request, File $file) {

    // Perform validation/authentication/auditing logic on the request

    // Fire off any events or notifiations (if applicable)

    return response()->download(storage_path('app/' . $file->location));
}

Есть и другие пути, которые вы также можете использовать, описанные в Документация вспомогательных функций Laravel

3
Kirkland

При использовании laravel 5 используйте этот код, так как вам не нужны заголовки.

return response()->download($pathToFile);.

Если вы используете Fileentry, вы можете использовать функцию ниже для загрузки.

// download file
public function download($fileId){  
    $entry = Fileentry::where('file_id', '=', $fileId)->firstOrFail();
    $pathToFile=storage_path()."/app/".$entry->filename;
    return response()->download($pathToFile);           
}
3
Ashwani Panwar

Я думаю, что вы можете использовать 

$file= public_path(). "/download/info.pdf";

$headers = array(
        'Content-Type: ' . mime_content_type( $file ),
    );

С этим вы будете уверены, что это PDF.

2
Ariel Ruiz

// Попробуйте это скачать любой файл. Laravel 5. *

// вам нужно использовать фасад "use Illuminate\Http\Response;" 

public function getDownload()
{

//PDF file is stored under project/public/download/info.pdf

    $file= public_path(). "/download/info.pdf";   

    return response()->download($file);
}
2
rohit ramani

Это часть HTML 

 <a href="{{route('download',$details->report_id)}}" type="button" class="btn btn-primary download" data-report_id="{{$details->report_id}}" >Download</a>

Это маршрут:

Route::get('/download/{id}', 'users\[email protected]')->name('download')->middleware('auth');

Это функция: 

public function getDownload(Request $request,$id)
{
                $file= public_path(). "/pdf/";  //path of your directory
                $headers = array(
                    'Content-Type: application/pdf',
                );
                 return Response::download($file.$pdfName, 'filename.pdf', $headers);      
}
0
Rishi