php如何使用$_FILES处理以base64编码传过来的文件?

客户端发起请求传送数据包含文件
| Content-Type | multipart/form-data; |
文件是以 base64 格式编码发送的
php 后端使用 $_FILES 接收文件数据打印结果如下

array(1) {

["file_test"]=>
    array(5) {
            ["name"]=>string(5) "4.jpg"
            ["type"]=>string(10) "image/jpeg"
            ["tmp_name"]=>string(45) "/var/lib/niginx/tmp/xxxx"
            ["error"]=>int(0)
            ["size"]=>int(18849)
        }
}

上传之后访问发现不是显示图片,而是显示 base64 的编码

php如何使用$_FILES处理以base64编码传过来的文件?

请问 php 怎么可以将这个 base64 格式的文件转成图片之后再上传

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

已经解决了,原来可以直接读取临时文件,并且写入临时文件

    public function imageDecode($file_tmp_path, $image_path)
    {
        $url = file_get_contents($file_tmp_path);
        $image_decoded = base64_decode($url);
        if ($image_decoded !== false) {
            // 定义保存图片的路径和文件名(含扩展名,根据图片类型)
            // 将解码后的图片数据写入文件
            if (!file_put_contents($image_path, $image_decoded)) {
                echo json_encode(['code' => -97, 'msg' => "图片保存失败"]);
                exit();
            }
        } else {
            echo json_encode(['code' => -98, 'msg' => "Base64解码失败,无效的图片数据"]);
            exit();
        }


    }

    public function test()
    {

        $this->imageDecode($_FILES['file_image']['tmp_name'], $_FILES['file_image']['tmp_name']);

        $file_path = 'test/'.time().'.jpg';
        $s3 = new S3Controller();
        $res = $s3->upload($file_path,$_FILES['file_image']['tmp_name']);
        var_dump($res);exit();

    }

file

11个月前 评论
fatrbaby 11个月前
讨论数量: 11

把 base64 解码后保存为文件

11个月前 评论
$post = $_POST['file'];
$fileData = base64_decode($post);
file_put_contents("filename", $fileData);
11个月前 评论
    // 获取 Base64 编码的图片字符串

    // 获取类型
    [$type,$base64] = explode(',',$base64Image);

    // 移除 "data:image/jpeg;base64," 前缀
    $base64Image = str_replace($type, '', $base64);

    // 解码 Base64 字符串
    $imageData = base64_decode($base64Image);

    // 生成文件名,你可以使用更复杂的逻辑来生成唯一的文件名
    $fileName = time() . '_' . uniqid() . '.jpeg';

    // 指定存储路径,这里使用 public 目录,你可以根据需求修改
    $filePath = 'uploads/' . $fileName;

    // 保存文件

    $result = Storage::disk('public')->put($filePath, $imageData);

    if ($result) {

        return [$filePath];
    }

    return [];
11个月前 评论

你应该从上传端就解决问题,而不是上传后再来多此一举

11个月前 评论

上传文件一般都是二进制流,为什么要 base64 编码呢?搞不懂这么做的意义。

11个月前 评论
gowithwind 11个月前
lovewei (作者) 11个月前
gowithwind 10个月前

    // 获取 Base64 格式的文件内容
    $base64String = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAbCAYAAABm409WAAAC5ElEQVRIicVWu3LTQBQ9kiw/87BjJwxkyDAZJmmAoaCnoaakpuAn+AeoKPiCVMzwCzRMqqSgYYYGnAkhOCYPJD8US1pz7sp2/JAcBzLDycherXbvuffco3WMLoExnMPBb8fhyBh/NIIwVHDCGjYrjxLXGHEEgOJlTg0u8IMAO18/oO7t4emDF7FrEqJcHlzQz+zkrI53O2/+IdIMaDRdbG2/4igcmdcSbW2/hupGD5RiXnGqDWdlWHhy/xnKc6vYpURffu6gr7TBv+ePXw5X0KKWHTKZvCwuVLDMFMvvkpSbDEN/m6aFlJXW94HycdI40hawOWdb2d53mmtsvN99OyBIyUfOLuDG4pp+WHcOsFbeQM3ZZ5AaKvM30Tx3UcxXNPEx55z2sd5smSbWV+5hMVfRpANZIE48RQaliEAyY74s3cB8toh8Zh7LC6sIwg4WckvIpHIMeqKzv2gtyydBaW4JxUJpUsZeewdNliDN8wZ+NQ7hM5tvR5+xVtkkKaVj4FCFetOt4h2t8yBbPhOi8WuoBxFaHRd19wDtTlM3We6PnO+6Gs9v4Xb5LlbL6wx4NeNpiVzvFA3vjM1UevLT3kftisPTKmpn+9phdfeQ2bASjruY7rIxgrwuKQwv/NtvmBD2SRX7MSibNi0VlmciSDgqZGr0HNKW5bz5NxLF8I7chUqhFbQRsJoCzZC2ErbFYOZ0umMj+fTDgHKGUzuSINEkokBdpKi/oOG34ckJwHHezvFlTY/Yt4+ZahX9JQ/xvFxN3+PVHpw/Lq2dMg1Kl756BRJcMg1UEGXEM8lhwPFtNo+RpezCyEsmuLQHIo0EjzwENDvtieACn2u8ISvPRCCB/F7wqBqlX7QkiGzjmNoDaaof+lH23YtxElRMZVMJxBUWNZf3gN3ieW8nr6WBslZmcj6uyR3lIW1me1mp2MziCKyehfuOSyTwcIzqj+plv5yJsGwLGysPkwmuE9f2X8V/I/gDThVx930X5SwAAAAASUVORK5CYII=';

    // 提取 Base64 字符串中的文件扩展名
    list($type, $data) = explode(';', $base64String);
    list(, $data) = explode(',', $data);
    $fileData = base64_decode($data);

    // 生成一个唯一的文件名
    $fileName = uniqid();

    // 获取文件扩展名
    $imageInfo = getimagesizefromstring($fileData);
    $extension = image_type_to_extension($imageInfo[2]);

    // 保存二进制数据为图片文件
    $fileNameWithExtension = $fileName . $extension;
    $file = fopen($fileNameWithExtension, 'wb');
    fwrite($file, $fileData);
    fclose($file);


    // 要保存的路径
    $targetDirectory = "d:/share/";

    // 将保存的图片文件移动到目标位置
    $targetPath = $targetDirectory . $fileNameWithExtension;
    if (rename($fileNameWithExtension, $targetPath)) {
        echo "base64 to img file success!";
    } else {
        echo "base64 to img file failed!";
    }
11个月前 评论

已经解决了,原来可以直接读取临时文件,并且写入临时文件

    public function imageDecode($file_tmp_path, $image_path)
    {
        $url = file_get_contents($file_tmp_path);
        $image_decoded = base64_decode($url);
        if ($image_decoded !== false) {
            // 定义保存图片的路径和文件名(含扩展名,根据图片类型)
            // 将解码后的图片数据写入文件
            if (!file_put_contents($image_path, $image_decoded)) {
                echo json_encode(['code' => -97, 'msg' => "图片保存失败"]);
                exit();
            }
        } else {
            echo json_encode(['code' => -98, 'msg' => "Base64解码失败,无效的图片数据"]);
            exit();
        }


    }

    public function test()
    {

        $this->imageDecode($_FILES['file_image']['tmp_name'], $_FILES['file_image']['tmp_name']);

        $file_path = 'test/'.time().'.jpg';
        $s3 = new S3Controller();
        $res = $s3->upload($file_path,$_FILES['file_image']['tmp_name']);
        var_dump($res);exit();

    }

file

11个月前 评论
fatrbaby 11个月前