Laravel如何将Vimeo存储的视频及元数据上传到Youtube?
解决方案说明
你当前使用的Laravel Youtube扩展包的upload方法默认仅支持传入本地文件路径或文件资源句柄,不支持直接传入远程HTTP URL,因此直接传入Vimeo直链无法正常执行上传。
方案1:无需下载到本地磁盘的流上传方案
你可以通过PHP的流读取能力直接拉取Vimeo远程视频的资源句柄,直接传递给上传方法,全程不需要将视频文件落地到本地磁盘,代码示例如下:
// 先打开Vimeo视频直链的只读流资源 $videoStream = fopen('https://player.vimeo.com/external/533693191.hd.mp4', 'r'); if ($videoStream) { $video = Youtube::upload($videoStream, [ 'title' => 'Test Video', 'description' => 'Bacon ipsum dolor sit amet rump turkey spare ribs shank, hamburger boudin frankfurter ham hock pancetta salami. Jerky porchetta salami, fatback swine chicken pastrami beef ribs landjaeger biltong. Capicola prosciutto leberkas landjaeger.' ]); // 上传完成后关闭资源句柄 fclose($videoStream); }
该方案注意事项:
- 需确保你使用的Vimeo直链没有防盗链限制,允许你的Laravel应用服务器IP直接访问
- 需要提前调整PHP配置参数,避免大视频上传超时:调大
max_execution_time、memory_limit、default_socket_timeout参数值 - 如遇网络波动会导致上传中断,大文件建议搭配Youtube的可恢复上传接口使用
方案2:临时下载到本地再上传(兼容稳定性更高)
如果流上传因为网络、权限等限制无法正常使用,可以先将视频下载到本地临时目录,上传完成后删除临时文件即可,代码示例如下:
// 生成临时文件路径 $tempPath = sys_get_temp_dir() . '/temp_' . uniqid() . '.mp4'; // 下载Vimeo视频到临时路径 file_put_contents($tempPath, fopen('https://player.vimeo.com/external/533693191.hd.mp4', 'r')); $video = Youtube::upload($tempPath, [ 'title' => 'Test Video', 'description' => 'Bacon ipsum dolor sit amet rump turkey spare ribs shank, hamburger boudin frankfurter ham hock pancetta salami. Jerky porchetta salami, fatback swine chicken pastrami beef ribs landjaeger biltong. Capicola prosciutto leberkas landjaeger.' ]); // 上传完成后删除临时文件 unlink($tempPath);
该方案注意事项:
- 需确保临时目录有足够的磁盘空间存放待上传的视频文件
- Vimeo直链的有效期需要覆盖下载+上传的总时长,避免中途链接失效
内容的提问来源于stack exchange,提问作者Steven Grant
相关产品推荐
相关产品推荐

