2016-07-11 7 views
0

Ich entwickle eine Website, die es Benutzern ermöglicht, Bilder auf ihr Konto hochzuladen. Und die Benutzer dürfen ein Formular ausfüllen und Bilder als Gast hochladen und werden dann aufgefordert, sich einzuloggen, wenn sie sich noch nicht angemeldet haben, und dann werden die Dateien gespeichert und die Datenbank anschließend aktualisiert.move_uploaded_file funktioniert nicht für Dateien, die in sesion gespeichert sind, ohne dass Fehlermeldungen angezeigt werden.

ich übrigens bin mit OpenCart,

Die Controller-Funktion die Form zu handhaben ist

  if (!$this->customer->isLogged()) { 
       //let's start the session 
       if (!isset($_SESSION)) { 
        session_start(); 
       } 

       $this->session->data['partner_front'] = $this->request->post; 
       $this->session->data['files'] = $this->request->files; 
       $this->session->data['redirect'] = $this->url->link('charity/partner&path=' . $project_id, '', 'SSL'); 
       $this->response->redirect($this->url->link('account/login', '', 'SSL')); 
      } else { 
       if(!isset($this->request->get['product_id'])){ 
        $this->model_account_customerpartner->addProduct($this->request->post); 
        $this->session->data['success'] = $this->language->get('text_success'); 
       } else { 
        $this->model_account_customerpartner->editProduct($this->request->post); 
        $this->session->data['success'] = $this->language->get('text_success_update'); 
       } 

Der Controller Funktionsteil in Login ist

 if (isset($this->session->data['partner_front']) && $this->session->data['partner_front']) { 
      $this->load->model('account/customerpartner'); 
      $this->model_account_customerpartner->addProduct($this->session->data['partner_front']); 
      $this->session->data['success'] = $this->language->get('text_success'); 

      unset($this->session->data['partner_front']); 
      unset($this->session->data['files']); 
      $this->response->redirect($this->url->link('account/customerpartner/productlist', '', 'SSL')); 
     } 

Und meine Modellfunktion die verwendet, um Bilder hochzuladen und Temp-Name für die SQL zu erstellen ist

public function addProduct($data){ 
$renamedImage = ''; 
$renamedOImage = array(); 
if(isset($this->session->data['files']) && $this->session->data['files']) { 
    $files = $this->session->data['files']; 
} else { 
    $files = $this->request->files; 
} print_r($files); 

if (isset($files['image']['name']) AND $files['image']['name']) { 
    if(count($files['image']['name']) == 1) { 
     $renamedImage = rand(100000,999999) . basename(preg_replace('~[^\w\./\\\\]+~', '', $files['image']["name"][0])); 
     move_uploaded_file($files["image"]["tmp_name"][0], DIR_IMAGE . MPIMAGEFOLDER .$renamedImage); 
    } else { 
     /** 
     * upload product base image 
     */ 
     $renamedImage = rand(100000,999999) . basename(preg_replace('~[^\w\./\\\\]+~', '', $files['image']["name"][0])); 
     move_uploaded_file($files["image"]["tmp_name"][0], DIR_IMAGE . MPIMAGEFOLDER .$renamedImage); 
     $renamedOImage[0] = $renamedImage; 

     foreach (array_slice($files['image']['name'], 1) as $index => $product_image) {    

      $renamedImg = rand(100000,999999) . basename(preg_replace('~[^\w\./\\\\]+~', '', $product_image)); 
      //upload product images 
      move_uploaded_file(array_slice($files['image']["tmp_name"], 1)[$index], DIR_IMAGE . MPIMAGEFOLDER .$renamedImg); 

      $renamedOImage[$index] = $renamedImg; 
     } 

    } 
}} 

Momentan kann das Bild hochgeladen werden, ohne die Login-Controller-Funktion zu durchlaufen. Es kann jedoch nicht hochgeladen werden, wenn die Benutzer aufgefordert werden, sich nach dem Senden des Formulars anzumelden. Ich habe print_r($files) verwendet, um die Struktur und den Inhalt der Dateien vor der Funktion move_uploaded_file zu überprüfen und die gleichen Ergebnisse von beiden zu erhalten.

Könnte mir jemand sagen, warum? Vielen Dank für jede Hilfe.

+1

Die hochgeladene Datei ist nur temporär, sie wird gelöscht, wenn das Skript, in das Sie hochladen, beendet wird. Sie können 'move_uploaded_file' nicht in einem späteren Skript in der Sitzung aufrufen. – Barmar

+0

Was @Barmar sagte ^^^ Aber Sie könnten die temporäre Datei im '\ tmp'-Ordner umbenennen und dann würde es nicht automatisch gelöscht werden, wenn das Upload-Skript beendet wird. ABER du würdest es selbst im zweiten Skript entfernen und es auf andere Weise kopieren und an seinen neuen Namen erinnern. – RiggsFolly

Antwort

0

Sie können move_uploaded_file nicht in einem anderen Skript aufrufen, da die hochgeladene Datei gelöscht wird, wenn das erste Skript beendet wird.

Was Sie tun müssen, ist das erste Skript die Datei in eine permanente Datei zu verschieben, und den Dateinamen in die Sitzungsvariable. Dann kann das zweite Skript diese Datei nach der Anmeldung mit dem Eintrag des Benutzers in der Datenbank verknüpfen.

Möglicherweise möchten Sie einen Cron-Job haben, der regelmäßig alte Dateien löscht, die nicht mit Konten verknüpft sind.

+0

Meinst du die 'move_uploaded_file' im' else' Teil der 'addProduct()' Funktion? Aber mein Problem tritt auf, wenn die Anzahl ($ files ['image'] ['name']) == 1 'sich ebenfalls trifft ... Und ich habe nur das Hochladen eines Bildes in diesem Moment getestet, was Probleme verursacht hat, wie ich schon sagte ... –

+0

Sie müssen 'move_uploaded_file' in der Controller-Funktion, die das Formular behandelt. Das Problem liegt nicht in den Sitzungsdaten. Das Problem besteht darin, dass die Datei, die Sie verschieben möchten, nicht mehr vorhanden ist, wenn der Anmelde-Controller ausgeführt wird. – Barmar

Verwandte Themen