2016-03-22 8 views
-1

Ich versuche gerade das Hochladen von Dateien in meinem CakePHP 3 Projekt zu ermöglichen. Ich habe die folgende Funktion in meiner Upload-Komponente, die die Dateien speichern (die durch $ als Eingabe gegeben werden this-> request-> Daten) in Webroot/img/uploads:Inkonsistenz zwischen dem Debug Text :: uuid() und dem tatsächlich hochgeladenen Dateipfad CakePHP 3

public function send($data) 
{ 
    if (!empty($data)) { 
     if (count($data) > $this->maxFiles) { 
      throw new InternalErrorException("Error Processing Request. Max number files accepted is {$this->max_files}", 1); 
     } 
     $fileNames = []; 
     $count = 0; 
     foreach ($data as $file) { 
      $filename = $file['name']; 
      $file_tmp_name = $file['tmp_name']; 
      $dir = WWW_ROOT.'img'.DS.'uploads'; 
      $allowed = ['png', 'jpg', 'jpeg']; 
      if (!in_array(substr(strrchr($filename , '.') , 1) , $allowed)) { 
       // Iterate through extension to sum up what types of files are allowed to upload 
       $output = "Error Processing Request. It is only allowed to upload files with the following extensions: "; 
       foreach($this->allowed as $extension){ $output .= $extension . ' '; } 
       throw new InternalErrorException($output, 1); 
      }elseif(is_uploaded_file($file_tmp_name)){ 
       debug(Text::uuid().'-'.$filename); 
       debug($file_tmp_name); 
       move_uploaded_file($file_tmp_name, $dir.DS.Text::uuid().'-'.$filename); 
      } 
     } 
    } 
} 

diese Funktion wird die Dateien gespeichert in der Tat zu der angegebene Ordner, aber mit einem anderen Dateinamen als beim Debuggen von Text :: uuid(). '-'. $ filename.

Debug-Ausgabe:

f5b0ca4f-cb73-4382-b1ca-0eee232ab17a-phinx.png 


Dateiname in Webroot/img/uploads Ordner:

4a635fa6-98ea-461e-a98d-0f6ac34c65e7-phinx.png 

Meine Frage ist: Wer weiß, wie der Name der Datei zu packen, dass wird in den Ordner webroot/img/uploads hochgeladen? Der Grund dafür ist, dass ich diese Pfade in einer Datenbank speichern möchte.

+1

Sie wissen, dass '' Text :: uuid() '' jedes Mal eine ** andere ** eindeutige ID zurückgibt, wenn es aufgerufen wird? Warum speichern Sie nicht einfach den '' Text :: uuid() '' auf einer Variablen und benutzen Sie ihn. Wie '' $ file_tmp_name, $ dir.DS. $ myvar .'- '. $ Filename''? – gmponos

+0

Danke für die schnelle Antwort :). Das hat für mich funktioniert, dumm von mir. Ich kann die richtige Antwort in mindestens 48 Stunden markieren. Vielleicht kann es jemand markieren? – markvdlaan93

+0

@gmponos sollte ihren Kommentar als Antwort eingeben, damit das OP es als akzeptiert markieren kann. –

Antwort

0

Mit Hilfe von gmponos ist es wichtig, die ID von Text :: uuid() in einer separaten Variablen zu speichern. Das hat für mich funktioniert.

public function send($data) 
{ 
    if (!empty($data)) { 
     if (count($data) > $this->maxFiles) { 
      throw new InternalErrorException("Error Processing Request. Max number files accepted is {$this->max_files}", 1); 
     } 
     $fileNames = []; 
     $count = 0; 
     foreach ($data as $file) { 
      $filename = $file['name']; 
      $file_tmp_name = $file['tmp_name']; 
      $dir = WWW_ROOT.'img'.DS.'uploads'; 
      $allowed = ['png', 'jpg', 'jpeg']; 
      if (!in_array(substr(strrchr($filename , '.') , 1) , $allowed)) { 
       // Iterate through extension to sum up what types of files are allowed to upload 
       $output = "Error Processing Request. It is only allowed to upload files with the following extensions: "; 
       foreach($this->allowed as $extension){ $output .= $extension . ' '; } 
       throw new InternalErrorException($output, 1); 
      }elseif(is_uploaded_file($file_tmp_name)){ 
       $uuid = Text::uuid(); 
       move_uploaded_file($file_tmp_name, $dir.DS.$uuid.'-'.$filename); 
      } 
     } 
    } 
}