将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错误且无响应体。
排查与修复方案
核心差异:请求体格式不匹配
curl的--upload-file是将文件内容作为原始请求体直接发送,而Laravel的attach()方法会将请求编码为multipart/form-data格式,这是导致400错误的关键原因。LinkedIn该上传端点仅接受纯文件内容作为请求体,不支持form-data。调整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);
- 验证请求头完整性
curl会自动添加Content-Length等必要请求头,Laravel Http facade通常会自动处理,但可通过开启请求日志确认:
- 在
.env中设置HTTP_CLIENT_LOG=true,查看storage/logs下的日志,对比curl的请求头细节,补充缺失的必要头信息。
- 检查文件有效性
确保文件路径正确且Laravel进程有权限读取:
$filePath = "path_to_file"; if (!file_exists($filePath) || !is_readable($filePath)) { die("文件不存在或无读取权限"); }
- 确认端点参数有效性
检查URL中的参数(如ut)是否过期,LinkedIn的临时上传参数可能有有效期,需确保使用的是最新生成的上传地址。
内容的提问来源于stack exchange,提问作者Jude F'do
相关产品推荐
相关产品推荐

