图片上传到数据库参考原始名称

时间:2019-02-17 23:39:06

标签: php codeigniter codeigniter-3

我正在从事Codeigniter项目。在图像上传配置中,我将其加密,以允许唯一的文件名,从而避免名称被覆盖和加倍,并总体上提高了安全性。

因此,上传时它将加密图像文件名,并将加密的名称存储在数据库中,同时将图像保存在我的资产文件夹中。但是由于某种原因,它似乎根本没有加密图像名称。几乎完全忽略了$config选项,而只是上传图像。

我还尝试了回叫功能以避免上载空白,并且再次似乎也被忽略了,并且仍然允许该帖子。

如果有人可以给小费。拜托。

控制器

//Callback validation
$this->form_validation->set_rules('userfile','Photo','callback_photo_check');

    if($this->form_validation->run() === FALSE){

      $this->load->view('templates/header');
      $this->load->view('posts/create', $data);
      $this->load->view('templates/footer');

    } else {

       if($this->form_validation->run()==TRUE){

      $config['upload_path'] = 'assets/images/posts';
      $config['allowed_types']        = 'gif|jpg|jpeg';
      $config['encrypt_name']         = TRUE; //TURN ON
      $config['max_size']             = 0;
      $config['max_width']            = 0;
      $config['max_height']           = 0;

      $this->upload->initialize($config);

      if(!$this->upload->do_upload('userfile')){

        $errors = array('error'=>$this->upload->display_errors());

              $this->load->view('templates/header');
              $this->load->view('posts/create', $errors);
              $this->load->view('templates/footer');

      }else {
        $this->post_model->create_post($this->upload->data('full_path'),$this->input->post());
      }

    }

    $this->session->set_flashdata('post_created','Your Post has been submitted');

    redirect('posts');

    }
  }


public function photo_check(){

if(empty($_FILES['userfile'])){
  $this->form_validation->set_message('photo_check', 'need a image');
                       return FALSE;
}

else{
  return TRUE;
}

}

模型

public function create_post($path,$post){

$data = array(

'about'=> $this->input->post('Description'),
'image' => $path,

);

return $this->db->insert('posts',$data);

2 个答案:

答案 0 :(得分:0)

我之前也遇到过同样的问题,所以我决定给它们(文件)一个唯一的名称,我所做的是: •我分配了一个空变量,该变量将保存要修改的文件名/路径数据,并将其命名为$info_name。 •每当文件名在现有位置重复时,都会添加一个唯一的扩展名,例如时间(秒,日期等)。

这是我的示例代码:

public function new_info($data,$photo){
    extract($data);
    $info_name = "";
    $directory = "C:/xampp/htdocs/Parent folder/child folder/grand child folder/";
    $extension= array("jpeg","jpg","png","gif");
    $file_name=$photo["form_name"]["name"];
    $file_tmp=$photo["form_name"]["tmp_name"];
    $ext=pathinfo($file_name,PATHINFO_EXTENSION);
    if(in_array($ext,$extension)){
        if(!file_exists($directory.$file_name)){
            move_uploaded_file($file_tmp=$photo["form_name"]["tmp_name"],$directory.$file_name);
            $info_name = $file_name;
        }
        else{
            $filename=basename($file_name,$ext);
            $newFileName=$filename.time().".".$ext;
            move_uploaded_file($file_tmp=$photo["form_name"]["tmp_name"],$directory.$newFileName);
            $info_name = $newFileName;
        }
    }

   // then your sql code here for example: 
   $data= array( 'user' => $_SESSION["user_id"],
                 'picture' => $info_name,
                );
    $this->db->insert('sys_post',$data);
  }

答案 1 :(得分:0)

要加密上传的文件名,您必须执行以下步骤。

1)您必须加载加密库。

您可以在具有上传代码的特定页面上调用此库。

public class Wykres {
private int xWartosc, yWartosc;
private String kolor;
private static Pane pane_root;

public void rysujPunkt(Pane root, int x, int y, String color){
    x+=180;
    y+=180;
    xWartosc = x;
    yWartosc = y;
    this.kolor = color;
    if(color.equals("NIEBIESKI")){
        root.getChildren().add(new Circle(x, y, 5, Color.BLUE));
    }
    else if(color.equals("CZERWONY")){
        root.getChildren().add(new Circle(x, y, 5, Color.RED));
    }

    pane_root = root;

}

public static Pane getPane_root(){return pane_root;}

或者您也可以将其加载到public class SiecNeuronowa { private Perceptron perceptron1; private Wykres wykres1; public SiecNeuronowa(){ wykres1 = new Wykres(); perceptron1 = new Perceptron(){ @Override public double finalizuj_dane(double potencjalMembranowy){ if(potencjalMembranowy>0) return 1; else if(potencjalMembranowy<0) return -1; else return 0; } }; perceptron1.dodajWejscia(2); Random random = new Random(); double rand_x = random.nextDouble(); double rand_y = random.nextDouble(); perceptron1.setWagaWejsciowa(0, rand_x); perceptron1.setWagaWejsciowa(1, rand_y); } public void dodajPunkt(){ Random random = new Random(); int x = random.nextInt()*150; int y = random.nextInt()*150; perceptron1.setDaneWejsciowe(0, x); perceptron1.setDaneWejsciowe(1, y); int wynik = (int)perceptron1.getWyjscie(); if(wynik == 1) wykres1.rysujPunkt(Controller.getPane(), x, y, "Niebieski"); else if(wynik == -1) wykres1.rysujPunkt(Controller.getPane(), x, y, "Czerwony"); }

autoload.php 文件中

2)现在,您正在使用Encryption类,必须在 config.php 文件中设置一个加密密钥。

// LOAD LIBRARIES
$this->load->library('encryption');

有关加密=> https://codeigniter.com/user_guide/libraries/encryption.html

的更多信息

3)最后,在您的上传代码$autoload['libraries'] = array('database','form_validation','encryption');中。

希望这会有所帮助。