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.
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
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