【问题标题】:CodeIgniter 3. Upload image twice but with different file nameCodeIgniter 3. 上传图片两次但文件名不同
【发布时间】:2020-07-31 06:32:18
【问题描述】:

[已解决]

我的控制器出现功能问题。我想将一张图片上传两次,并将其保存在同一目录中,但文件名不同。

这是我的表单(view.php):

<form action="<?php echo base_url("process/testFunction"); ?>" enctype="multipart/form-data" method="post">
 <input type="file" name="file_data" size="50" required>
 <input type="hidden" name="user_id" value="<?php echo $this->session->userdata('user_id'); ?>" readonly>
 <input type="hidden" name="purpose" value="Picture" readonly>
 <input type="submit" value="Save Changes">
</form>

controller.php:

function testFunction(){
 $userID = $this->input->post('user_id');
 $purpose = $this->input->post('purpose');
 $randomText = time();

 if($purpose == "Picture"){
  $uploadPath = "./uploads/images/";
  $allowedTypes = "jpg|jpeg|png";
  $maxSize = 10000000;
  $fileName = "PP_".$userID.".jpeg";
  $fileName2 = "PP_".$userID."_".$randomText.".jpeg"; //for backup
 }

 $config = array(
   'upload_path' => $uploadPath,
   'allowed_types' => $allowedTypes,
   'max_size' => $maxSize, 
   'file_name' => $fileName
 );

 $configClone = array(
   'upload_path' => $uploadPath,
   'allowed_types' => $allowedTypes,
   'max_size' => $maxSize, 
   'file_name' => $fileName2
 );

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

 if($this->upload->do_upload('file_data')){
   echo "Uploaded";
 }else{
   echo $this->upload->display_errors();
 }
}

我的代码中目前正在发生的事情是。虽然它上传了 2 张相同的图像。带有“随机文本”的文件名不起作用。

[解决方案]:控制器文件。我修改了一些行。

参考:下面哈维尔的回答

$this->load->library('upload', $config);
if($this->upload->do_upload('file_data')){
 unset($this->upload);
 $this->load->library('upload', $configClone);
 $this->upload->do_upload('file_data');
   echo "Uploaded";
}else{
   echo $this->upload->display_errors();
}

【问题讨论】:

  • 如果您只是上传一张图片并使用不同的文件名保存两次,那么上传一次并复制它可能会更有用 - 这可能会有所帮助 - stackoverflow.com/questions/11442779/…
  • 当您允许其他类型时,您的示例代码还将图像类型硬编码为 .jpeg。您想在命名文件时使用实际图像的扩展名,或者在需要时转换它们。

标签: php codeigniter file-upload codeigniter-3


【解决方案1】:

连续两次加载上传库,即使使用不同的配置数组,也不会做任何事情。如果库已经在内存中,Codeigniter 将忽略第二条$this-&gt;load-&gt;library(); 语句。这是为了防止冲突、竞争条件等。

你需要:-

  1. 加载库的第一个实例
  2. 处理第一次上传
  3. 卸载库的第一个实例
  4. 加载库的第二个实例
  5. 处理第二次上传

例如,在处理第一次上传后,可以使用unset($this-&gt;upload); 实现第 3 点。

【讨论】:

  • 感谢哈维尔。现在,我的功能按预期工作。
【解决方案2】:

删除这一行

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

改变

if($this->upload->do_upload('file_data')){
   $this->upload->initialize($configClone);
   if($this->upload->do_upload('file_data')){
        echo "Uploaded";
   }else{
        echo $this->upload->display_errors();
   }
 }else{
   echo $this->upload->display_errors();
 }

解释: Javier Larroulet's answer

【讨论】:

  • 感谢您的回答。虽然,我已经应用了哈维尔的解决方案。这也是一个很大的帮助。谢谢。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 2020-12-11
  • 2012-10-07
  • 2020-06-08
  • 2012-01-28
  • 2013-01-29
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多