Storage::putFileAs 是否可以保存远程文件到本地磁盘

需要第三方服务器下PDF文件,文件链接为https://sci.bban.top/pdf/10.3390/su9050682.pdf,该链接可在浏览器中成功打开该文件。

代码如下:

    $pdflink="https://sci.bban.top/pdf/10.3390/su9050682.pdf";
    $folder_name="pdf\\";
    $path=public_path() . '\\' . $folder_name;
    $file= Storage::putFileAs($path,new File($pdflink),'1.pdf');

出现以下错误:

Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException
The file "https://sci.bban.top/pdf/10.3390/su9050682.pdf" does not exist

但使用copy()可以下载,

copy("$pdflink", "G:/pdf/" . $title . ".pdf");

求教各位Storage::putFileAs是否可以保存远程文件?还是代码哪里不对?先谢谢了!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 14

同求:Storage::putFileAs 是否可以保存本地磁盘绝对路径到app空间目录,使用command方式不是http方式?

3年前 评论
Storage::putFileAs($path, Http::get($pdflink)->getBody(), '1.pdf');
3年前 评论

@Imuyu 你写这你试过么。。。

3年前 评论
Imuyu 3年前

谢谢你的回复。 试了一下,报错:

Error
Call to undefined method GuzzleHttp\Psr7\Stream::getRealPath()

dd(Http::get($pdflink)->getBody());得到以下输出。response 里面没有 pdf 对象。

GuzzleHttp\Psr7\Stream {#1266 ▼
  -stream: stream resource @607 ▼
    wrapper_type: "PHP"
    stream_type: "TEMP"
    mode: "w+b"
    unread_bytes: 0
    seekable: true
    uri: "php://temp"
    options: []
  }
  -size: null
  -seekable: true
  -readable: true
  -writable: true
  -uri: "php://temp"
  -customMetadata: []
}
3年前 评论
Storage::put('1.pdf', file_get_contents($url))
3年前 评论

@fangmuke @Imuyu Storage::put($filename, (new Client())->get($url, ['verify' => false])->getBody()) 可以顺利保存远程 PDF。必须带上['verify' => false] 才行。这点没搞明白,@Imuyu 可否解释一下。感谢!

3年前 评论

另外有一个问题请教各位,关于文件路径的问题。成功保存 pdf 后,用$file_path=Storage::path($file)返回文件保存路径,得到的路径是:G:\laragon\www\sci2pdf\storage\app\pdfs/Economic analysis of a traceability system for a two level perishable food supply chain.pdf 为什么在返回路径中 pdfs之后就是/,而不是\? 带/的路径在windo里面是错误的呀。 感谢大家!可能这个问题比较菜。

3年前 评论

@xumng 测试了以下几种方法:php原生的 copy()方法,Laravel 的 Storage 提供的 put,putFileAs,copy方法,最快的是putFileAs. 我之前看了文档写的是 $file= Storage::putFileAs($path,new File($pdflink),'1.pdf'); 不正确,正确的应该是:$file= Storage::putFileAs($path,$pdflink,'1.pdf');,$path 是要保存pdf文件的路径,$pdflink是要保存的目标PDF文件的链接。我的理解(不知道正不正确),用 new File()就变成要在 $pdflink给出的链接地址新建文件,所以报错The file "https://sci.bban.top/pdf/10.3390/su9050682.pdf" does not exist,因为无法在别人的服务器上新建文件。如有没没理解对的地方,麻烦各位指正。感谢!

3年前 评论

我测试上面几种方法都没成功。。
最后我还是先保存本地了。。。

    /**
     * 保存微信素材到 Oss
     * @param $media_id
     * @return string
     */
    public function mpMediaToOss($media_id): string
    {
        $media = WechatService::instance()->getTemporaryMedia($media_id);
        if(empty($media)) return '';
        // 下载微信临时素材
        $file = Http::get($media);
        $file_name = $file->header('Content-disposition');
        $partnner = '!filename="(.*)"!';
        preg_match_all($partnner, $file_name, $match);
        $file_name = $match[1][0]??$media_id;
        // 保存临时素材到本地
        $local = storage_path('app/').$file_name;//本地路径
        file_put_contents($local,$file->body());//保存文件到本地
        // 保存临时素材到 oss
        $file = new UploadedFile($local,$local);
        $dir = "operation_voices";//oss 存储路径
        $disk = Storage::disk('oss');
        $result = $disk->putFileAs($dir, $file,$file_name);
        if($result){
            @unlink($local);//删除本地文件
            $config = Config::get('filesystems.disks.oss');
            return "{$config['base_url']}/{$result}";
        }
        @unlink($local);//删除本地文件
        return $media_id;
    }
1年前 评论
littlebear0871 (楼主) 1年前

file

Storage::put('本地路径', file_get_contents(远程文件url))
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!