进行PHP图片上传转存到指定文件夹,数据库内保存路径,但是保存中文图片时遇到了一些问题

<?php
    //1.获取上传文件信息
    $upfile=$_FILES["pic"];
    //定义允许的类型
    $typelist=array("image/jpeg","image/jpg","image/png","image/gif");
    $path="./upfiles/";//定义一个上传后的目录
    //2.过滤上传文件的错误号
    if($upfile["error"]>0){
        switch($upfile['error']){//获取错误信息
            case 1:
                $info="上传得文件超过了 php.ini中upload_max_filesize 选项中的最大值.";
                break;
            case 2:
                $info="上传文件大小超过了html中MAX_FILE_SIZE 选项中的最大值.";
                break;
            case 3:
                $info="文件只有部分被上传";
                break;
            case 4:
                $info="没有文件被上传.";
                break;
            case 5:
                $info="找不到临时文件夹.";
                break;
            case 6:
                $info="文件写入失败!";break;
        }die("上传文件错误,原因:".$info);
    }
    //3.本次上传文件大小的过滤(自己选择)
    if($upfile['size']>2000000){
        die("上传文件大小超出限制");
    }
    //4.类型过滤
    if(!in_array($upfile["type"],$typelist)){
        die("上传文件类型非法!".$upfile["type"]);
    }
    //5.上传后的文件名定义
    do{ 
        $newfile=$upfile["name"];//此处上传中文名称图片,转存到指定目录里名称会是乱码
    }while(file_exists($path.$newfile));
    //6.执行文件上传
    //判断是否是一个上传的文件
    if(is_uploaded_file($upfile["tmp_name"])){
        //执行文件上传(移动上传文件)
        if(move_uploaded_file($upfile["tmp_name"],$path.$newfile)){
            echo "文件上传成功!";
            include('config.php');
            //将图片的名称和路径存入数据库
            $sql = "INSERT INTO image3(path) VALUES ('$path$newfile')";
            $result = mysqli_query($conn,$sql);
            if($result){
                echo"文件已存储到数据库";
            } else {
                echo"请求失败,请重试";
            }
        } else {
            die("上传文件失败!");
        }
    }else{
    die("不是一个上传文件!");
  }
?>

测试把图片保存到同目录的upfiles文件夹内,数据库里保存图片的路径,已经能将图片转存进去,并且数据库里保存的也是路径+图片名称。
但是在测试的过程中,发现中文名称的图片转存过去,名称会变成乱码,而数据库里保存路径里的图片名称是中文,导致我获取图片的时候获取不到,只获取到数据库中的名称。
我按照网上的有尝试过在存储时对编码进行转换,if(move_uploaded_file($upfile["tmp_name"],$path.$newfile("utf-8","gb2312"))){
if(move_uploaded_file($upfile["tmp_name"],iconv("gb2312","UTF-8", $path.$newfile))){
但是提示超过最大执行时间30s,无法转存。
该怎么样在上传图片后转存图片可以是中文也可以是英文的?
///////////////////////////////////////////////////////////
我转换写错地方了,在上传的文件名定义那里添加,$newfile=iconv("utf-8","gb2312",$upfile["name"])转存过去的图片是中文和英文都有的了,但是又产生了新的问题,我数据里保存的路径名现在只有路径,没有图片名称了...
image
我已经蒙了,现在转存有中文,数据库存的时候没有名称了,该咋处理?

阅读 2.8k
1 个回答

建议你使用文件的 MD5 来当做文件名。你这样的话会导致重名图片被异常覆盖

网上有说 iconv("UTF-8","gb2312",$filname) ,怎么看上去你写反了

写库的时候别用转码呗。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题