如何用PHP将OneDrive共享链接的文件拷贝到Laravel服务器
解决方案
问题根源
你当前获取的OneDrive共享链接是网页预览地址,不是文件直链,file_get_contents请求后返回的是HTML页面内容,并非PDF二进制流,所以保存后无法正常打开。
快速修复方案
直接在原有共享链接末尾添加&download=1参数,同时在流配置中开启自动跳转,修改后的代码如下:
// 原共享链接添加download=1参数,触发直接下载 $fileurl = "https://sindionsa-my.sharepoint.com/:b:/g/personal/yasser_sindion_com/Edk_7pdslBdKppoCxC_l2BwB7MpYL5k_Y4r94HC2SYTZCw?e=RTjVqh&download=1"; $context = stream_context_create( array( "http" => array( "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36", "follow_location" => true, // 允许跟随302跳转,OneDrive下载地址会返回跳转 "max_redirects" => 5 // 限制最大跳转次数 ) ) ); $drive_file = file_get_contents($fileurl, false, $context); // 增加校验:如果获取失败或者内容不是PDF,直接报错 if ($drive_file === false || strpos($http_response_header[0], '200') === false || strpos($http_response_header['Content-Type'], 'application/pdf') === false) { die('文件获取失败,请检查共享链接权限'); } $pdf_filename_2 = substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 51), 1).substr(md5(time()), 1); $save_attachment_file_8 = public_path($pdf_filename_2.'.pdf'); file_put_contents($save_attachment_file_8, $drive_file); echo "done";die;
Laravel下更稳定的方案(推荐)
Laravel自带Guzzle HTTP客户端,比file_get_contents容错性更高,代码示例:
use Illuminate\Support\Facades\Http; $fileurl = "https://sindionsa-my.sharepoint.com/:b:/g/personal/yasser_sindion_com/Edk_7pdslBdKppoCxC_l2BwB7MpYL5k_Y4r94HC2SYTZCw?e=RTjVqh&download=1"; $response = Http::withOptions([ 'allow_redirects' => true, ])->withHeaders([ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' ])->get($fileurl); if (!$response->successful() || $response->header('Content-Type') !== 'application/pdf') { die('文件获取失败,请检查共享链接权限'); } $pdf_filename_2 = substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 51), 1).substr(md5(time()), 1); $save_path = public_path($pdf_filename_2.'.pdf'); file_put_contents($save_path, $response->body()); echo "done";die;
注意事项
- 确认OneDrive共享链接的权限设置为「任何拥有链接的用户均可查看」,否则会跳转到登录页面,无法获取文件内容
- 如果共享文件需要账号权限才能访问,需要对接Microsoft Graph API,通过OAuth2授权后调用文件下载接口,不能使用直链方案
- 生产环境建议增加文件大小校验、异常捕获逻辑,避免因网络波动导致文件保存不完整
内容的提问来源于stack exchange,提问作者Mani
相关产品推荐
相关产品推荐

