1

我正在尝试为将上传到我的服务器的图像创建缩略图。请参阅https://www.codeigniter.com/userguide3/libraries/image_lib.html#processing-an-image。创建后,我想将缩略图保存到另一个文件夹,因为原始图像和缩略图都将保存在同一位置。

所以,我尝试使用move_uploaded_file()函数,但它无法移动文件。我不确定我的代码是否正确完成。看看这个。

Belwo 是我的代码:

if($_FILES['file_name']['size'] != 0){
    $config['upload_path']          = FCPATH.MEDIA_LIB_URI.'facts';
    $config['allowed_types']        = 'jpg|jpeg|png|gif';
    $config['max_size']             = 0;

    $newFileName = removeExt($_FILES['file_name']['name']).'-'.uniqueId();      // renaming the file name without the ext
    $new_name = $newFileName.getExt($_FILES['file_name']['name']);              // new file name with the ext
    $config['file_name'] = $new_name;

    $this->load->library('upload',$config);
    $this->upload->initialize($config);

    if($this->upload->do_upload('file_name')){
        $uploadData = $this->upload->data();
        $file_name = $uploadData['file_name'];

        $this->load->library('image_lib');
        $configer = array(
            'image_library'   => 'gd2',
            'source_image'    => $uploadData['full_path'],
            'create_thumb'    => TRUE,
            'maintain_ratio'  => TRUE,
            'width'           => 950,
            'height'          => 950,
        );

        $this->image_lib->clear();
        $this->image_lib->initialize($configer);
        $this->image_lib->resize();

        $thumbName = $newFileName.'_thumb'.getExt($_FILES['file_name']['name']);    // getting the exact thumbnail name that been created by codeigniter
        move_uploaded_file($thumbName, FCPATH.MEDIA_LIB_URI.'facts/thumbnail/'.$new_name);

        return $file_name;
    } else {
        return $this->upload->display_errors();
    }
}
4

2 回答 2

1

您使用重命名或复制找到了正确的解决方案。

它不适用于 move_uploaded_file 的原因是因为此函数只会移动 $_FILES 数组中临时名称等于“tmp_name”的上传文件。

这种行为的原因在 PHP 手册中有解释:“这个函数检查以确保 filename 指定的文件是一个有效的上传文件(意味着它是通过 PHP 的 HTTP POST 上传机制上传的)。如果文件是有效的,它“

根据 POST 方法上传的 PHP 手册:

$_FILES['userfile']['name'] = 客户端机器上文件的原始名称。$_FILES['userfile']['tmp_name'] = 上传文件存储在服务器上的文件的临时文件名。

结束报价

“tmp_name”是唯一的服务器生成的密钥,因此文件系统中没有文件名重复。

在您的代码中,您构建的 $thumbnail 字符串与 $_FILES 数组中的“tmp_name”不匹配。

您没有收到错误消息的原因是,再次来自 PHP 手册,但这次是 move_uploaded_file:“如果文件名不是有效的上传文件,则不会发生任何操作,并且 move_uploaded_file() 将返回 FALSE。”

因此,如果您在代码中捕获 move_uploaded_file 的结果,例如 $moveResult = move_uploaded_file(... 您最终将得到 $moveResult === false。检查此类操作的结果以便在出现以下情况时做出反应总是一个好主意出了点问题。

于 2018-08-03T04:38:02.990 回答
1

希望对你有帮助 :

用于new_image更改$configer文件夹路径:$config['new_image'] = '/path/to/new_image.jpg';

注意:如果只指定了新的图像名称,它将被放置在与原始图像相同的文件夹中

如果仅指定路径,则新图像将放置在与原始图像同名的目标中。

如果同时指定了路径和图像名称,它将放置在自己的目标中并赋予新名称。

你的代码应该是这样的:

if($this->upload->do_upload('file_name'))
   {
        $uploadData = $this->upload->data();
        $file_name = $uploadData['file_name'];

        $this->load->library('image_lib');
        $configer = array(
            'image_library'   => 'gd2',
            'source_image'    => $uploadData['full_path'],
            'create_thumb'    => TRUE,
            'maintain_ratio'  => TRUE,
            'width'           => 950,
            'height'          => 950,
            'new_image'       => FCPATH.MEDIA_LIB_URI.'facts/thumbnail/'
        );

        $this->image_lib->clear();
        $this->image_lib->initialize($configer);
        $this->image_lib->resize();
        return $file_name;
    } 
    else 
    {
        return $this->upload->display_errors();
    }

更多信息:https ://www.codeigniter.com/user_guide/libraries/image_lib.html#CI_Image_lib::resize

于 2018-08-03T06:25:53.417 回答