You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:54:01