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

Laravel上传图片至FTP服务器时如何保留原文件名而非生成哈希名?

问题描述

已成功将图片文件上传至FTP服务器,但文件名是自动生成的哈希值,希望上传的文件名与原图片文件名一致。目前数据库中保存的是未哈希的原文件名,但FTP服务器上的文件名却是哈希格式。

  • FTP服务器上的文件示例:文件名是自动生成的哈希字符串(如长串无意义字符)
  • 数据库中保存的文件名示例:与本地原文件名完全一致(如example.jpg)
现有控制器代码
$lampiran = Lampiran_tte::where('surat_tte_id', $surat->id);
if ($request->hasfile('lampiran_gambar')) {
    $files = [];
    foreach ($request->file('lampiran_gambar') as $file) {
        if ($file->isValid()) {
            $filename  = $file->getClientOriginalName();
            $file->store('/lampiranSurat', 'ftp') . '/' . $filename;
            $files[] = [
                'lampiran_gambar' => $filename,
            ];
        }
    }
    $gambar = '';
    foreach ($files as $value) {
        $gambar .= $value['lampiran_gambar'].'#';
    }
    $gambar = substr($gambar, 0, -1);
    $lampiran->update([
        'isi_lampiran'       => $request->isi_lampiran,
        'lampiran_gambar'    => $gambar,
        'update_by'          => Auth::user()->name,
    ]);
}
解决方案

问题根源是store()方法默认会生成哈希文件名,改用storeAs()方法即可指定原文件名存储。

修改后的代码:

$lampiran = Lampiran_tte::where('surat_tte_id', $surat->id);
if ($request->hasfile('lampiran_gambar')) {
    $files = [];
    foreach ($request->file('lampiran_gambar') as $file) {
        if ($file->isValid()) {
            $filename = $file->getClientOriginalName();
            // 使用storeAs指定存储目录、原文件名和磁盘
            $file->storeAs('/lampiranSurat', $filename, 'ftp');
            $files[] = [
                'lampiran_gambar' => $filename,
            ];
        }
    }
    $gambar = '';
    foreach ($files as $value) {
        $gambar .= $value['lampiran_gambar'].'#';
    }
    $gambar = substr($gambar, 0, -1);
    $lampiran->update([
        'isi_lampiran'       => $request->isi_lampiran,
        'lampiran_gambar'    => $gambar,
        'update_by'          => Auth::user()->name,
    ]);
}

关键说明

  • storeAs()参数:第一个是存储目录,第二个是要保存的原文件名,第三个是指定使用的存储磁盘(这里为ftp)
  • 原代码中$file->store(...) . '/' . $filename只是拼接字符串,没有实际作用,直接替换为storeAs()即可实现按原文件名上传

内容的提问来源于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 04:30:55