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

Laravel发送已保存文件至外部API提示无效图片,求解决方案

问题分析与解决方案

你的核心问题在于文件传输方式错误:

  • 你用Storage::get()获取了文件的原始二进制内容,但通过asForm()将其作为普通表单字段发送,这种方式会让外部API无法识别这是一个有效文件(API期望接收multipart/form-data格式的文件上传,而非普通文本字段)。
  • asForm()默认使用application/x-www-form-urlencoded编码,完全不适合传输文件内容,这也是API返回"Send a valid image"的根本原因。

修正代码

你需要改用Laravel HTTP客户端的attach()方法实现文件上传,它会自动将请求设置为multipart/form-data格式,符合外部API的文件接收要求:

// 获取文件的本地存储路径
$filePath = Storage::path(auth()->user()->pan_photo);
// 获取文件名(用于API识别文件类型)
$fileName = basename(auth()->user()->pan_photo);

$response = Http::withHeaders([
    // 填入你的自定义请求头部
])->attach(
    'pancard', // API要求的文件字段名
    file_get_contents($filePath), // 文件二进制内容
    $fileName, // 带后缀的文件名(如xxx.jpg/xxx.pdf)
    ['Content-Type' => Storage::mimeType(auth()->user()->pan_photo)] // 指定文件MIME类型
)->put('https://staging.eko.in:25004/ekoapi/v1/user/service/activate');

Log::channel('response')->info($response);

更简洁的写法(直接传入文件路径):

$response = Http::withHeaders([
    // 填入你的自定义请求头部
])->attach(
    'pancard',
    Storage::path(auth()->user()->pan_photo)
)->put('https://staging.eko.in:25004/ekoapi/v1/user/service/activate');

Log::channel('response')->info($response);

额外检查项

  • 确认auth()->user()->pan_photo存储的是正确的文件路径(相对于Laravel存储根目录)。
  • 验证文件MIME类型是否为API支持的image/jpeg、image/jpg或application/pdf,可通过Storage::mimeType()获取后提前校验。
  • 本地打开文件确认其完整性,避免因文件损坏导致API报错。

内容的提问来源于stack exchange,提问作者sangam4742

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:32:22