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

Laravel FTP存储JS API响应报错:UTF-8字符格式异常排查

问题:Laravel调用FTP存储API返回JSON时出现UTF-8编码错误

在Laravel项目中,通过JS API调用FTP存储获取响应时,触发InvalidArgumentException错误,提示内容为Malformed UTF-8 characters, possibly incorrectly encoded。

相关配置与代码

文件系统配置(config/filesystems.php)

'default' => env('FILESYSTEM_DRIVER', 'ftp')

'ftp' => [
    'driver'   => 'ftp',
    'host'     => env('FTP_HOST'),
    'username' => env('FTP_USERNAME'),
    'password' => env('FTP_PASSWORD'),
    'root'     => '/web',
],

.env配置

FTP_HOST=exampleftpserver.com
FTP_USERNAME=userftp
FTP_PASSWORD=password123

控制器代码

$explode = explode('#',$lampiran->lampiran_gambar);
foreach($explode as $row){
    if($row == null){
        $row1[] = 'null';
    }else{
        $row1[] = Storage::disk('ftp')->get('/lampiranSurat/' . $row);
    }
}
if($pegawai_pejabat->jenis_jabatan_id == 1){
    return response()->json([
        'meta' => [
            'code' => 200,
            'status' => 'success',
            'message' => 'Data Ditemukan',
        ],
        'data_verifikasi' => $verifikasi,
        'lampiran_gambar' => $row1,
        'pegawai_verif'   => $pegawai_verif,
    ]);
}

错误原因

Storage::disk('ftp')->get()返回的是二进制文件内容(比如图片、PDF等非文本文件),直接将二进制数据放入JSON响应会触发UTF-8编码异常——JSON要求内容必须是合法的UTF-8字符串,而二进制数据包含大量非UTF-8字符。

解决方案

方法1:将二进制内容转为Base64编码

把文件内容转换为Base64字符串后再放入JSON,这样就能安全传输:

$explode = explode('#',$lampiran->lampiran_gambar);
foreach($explode as $row){
    if($row == null){
        $row1[] = 'null';
    }else{
        $fileContent = Storage::disk('ftp')->get('/lampiranSurat/' . $row);
        $row1[] = base64_encode($fileContent);
    }
}
if($pegawai_pejabat->jenis_jabatan_id == 1){
    return response()->json([
        'meta' => [
            'code' => 200,
            'status' => 'success',
            'message' => 'Data Ditemukan',
        ],
        'data_verifikasi' => $verifikasi,
        'lampiran_gambar' => $row1,
        'pegawai_verif'   => $pegawai_verif,
    ]);
}

前端拿到Base64字符串后,可通过对应方式还原文件:

  • 图片:使用<img src="data:image/[格式];base64,[Base64字符串]" />
  • 其他文件:将Base64转为Blob对象后下载或预览。

方法2:返回文件HTTP访问URL(推荐)

如果FTP服务器支持通过HTTP直接访问文件,直接返回文件URL更高效,避免Base64带来的体积膨胀:

$explode = explode('#',$lampiran->lampiran_gambar);
foreach($explode as $row){
    if($row == null){
        $row1[] = 'null';
    }else{
        // 替换为你的FTP服务器对应的HTTP访问前缀
        $row1[] = 'http://your-ftp-http-domain.com/web/lampiranSurat/' . $row;
    }
}
// 后续JSON返回逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:55:48