尝试从URL下载文件时“找不到文件”

时间:2018-01-02 16:04:21

标签: php laravel

我有存储在S3上的文件,我希望能够强制下载它们。

出于这个目的,我想出了以下路线:

Route::get('/download/{link}','HomeController@download');

和控制器功能:

 public function download(Request $request, $link){

        $filename = 'S3 FILE';
        $tempImage = tempnam(sys_get_temp_dir(), $filename);
        copy($link, $tempImage);

        return response()->download($tempImage, $filename);

    }

查看:

    <a href="/download/{{url($uploads[0]->txtURL)}}" download="download">Download</a>

我不知道为什么当我点击链接时文件没有下载而是我得到了

  

找不到文件

     

Firefox无法找到该文件   http://learn-laravel.dev/download/https://bbbucket.s3.eu-west-2.amazonaws.com/ *******。TXT。

任何人都可以帮我解决问题吗?我想要做的是force download S3链接上的文件。

2 个答案:

答案 0 :(得分:2)

在我的解决方案之下

路由

Route::get('/download','HomeController@download');

控制器

public function download() {
    //get url from request
    $link = request()->input('url');

    $filename = 'S3 FILE';
    $tempImage = tempnam(sys_get_temp_dir(), $filename);
    copy($link, $tempImage);

    return response()->download($tempImage, $filename);
}

请求

http://learn-laravel.dev/download/?url=https://bbbucket.s3.eu-west-2.amazonaws.com/*******.txt

请记住使用相对于url参数的urlencode

http://learn-laravel.dev/download/?url=https%3A%2F%2Fbbbucket.s3.eu-west-2.amazonaws.com%2F%2A%2A%2A%2A%2A%2A%2A.txt

查看

<a href="{{ route('download') }}?url={{ urlencode($uploads[0]->txtURL) }}" download="download">Download</a>

答案 1 :(得分:0)

  

我不知道为什么当我点击链接时文件没有下载但是我得到了...

您需要使用nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, new NsdManager.RegistrationListener() {...}); 帮助程序对您的请求进行编码。

url()

注意:网址必须是完全限定的网址,才能将其发送到其他地方。

  

来自Laravel Docs

     

<a href="{{ url('https://path/to/s3/file') }}">Download S3 file.</a> 函数生成指定路径的完全限定URL。

因此,如果给定url生成url('/posts')

鉴于http://localhost:8000/posts生成url('http://yourdomain.com/about')

而不是:

http://yourdomain.com/about

尝试:

<a href="/download/{{url($uploads[0]->txtURL)}}" download="download">Download</a>

注意: <a href="{{ url($uploads[0]->txtURL) }}">Download</a> 需要格式化的内容:scheme://domain/path