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

将curl文件上传命令转为Laravel Http时遇400错误求助

问题:Laravel Http facade转换curl文件上传命令返回400 Bad Request

原可正常运行的curl上传命令:

curl -i --upload-file ~/Desktop/Myimage.jpg -H 'Authorization: Bearer Redacted' "https://www.linkedin.com/dms-uploads/C5622AQHdBDflPp0pEg/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&sync=1&v=beta&ut=1lrKqjt4fYuqw1"

尝试转换的Laravel Http facade代码:

Http::attach("file_display_name", file_get_contents("path_to_file"), "file_name_with_extension")
->withHeaders([
    "Authorization" => "Bearer Redacted"
])
->put("https://www.linkedin.com/dms-uploads/C5622AQHdBDflPp0pEg/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&sync=1&v=beta&ut=1lrKqjt4fYuqw1");

补充测试:用Postman以PUT方法+form-data传文件测试,同样返回400错误且无响应体。


排查与修复方案

  1. 核心差异:请求体格式不匹配
    curl的--upload-file是将文件内容作为原始请求体直接发送,而Laravel的attach()方法会将请求编码为multipart/form-data格式,这是导致400错误的关键原因。LinkedIn该上传端点仅接受纯文件内容作为请求体,不支持form-data。

  2. 调整Laravel请求逻辑,模拟curl行为
    替换attach(),直接将文件内容作为PUT请求的主体发送,并指定正确的MIME类型:

$filePath = "path_to_file";
$fileContent = file_get_contents($filePath);
$mimeType = mime_content_type($filePath); // 自动获取文件MIME类型

$response = Http::withHeaders([
    "Authorization" => "Bearer Redacted",
    "Content-Type" => $mimeType,
])->put("https://www.linkedin.com/dms-uploads/C5622AQHdBDflPp0pEg/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&sync=1&v=beta&ut=1lrKqjt4fYuqw1", $fileContent);
  1. 验证请求头完整性
    curl会自动添加Content-Length等必要请求头,Laravel Http facade通常会自动处理,但可通过开启请求日志确认:
  • 在.env中设置HTTP_CLIENT_LOG=true,查看storage/logs下的日志,对比curl的请求头细节,补充缺失的必要头信息。
  1. 检查文件有效性
    确保文件路径正确且Laravel进程有权限读取:
$filePath = "path_to_file";
if (!file_exists($filePath) || !is_readable($filePath)) {
    die("文件不存在或无读取权限");
}
  1. 确认端点参数有效性
    检查URL中的参数(如ut)是否过期,LinkedIn的临时上传参数可能有有效期,需确保使用的是最新生成的上传地址。

内容的提问来源于stack exchange,提问作者Jude F'do

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:44:54