Язык: PHP / MySQL
Я сойду с ума, мне действительно нужно спросить сейчас … У меня есть форма для загрузки нескольких файлов:
<input type="file" name="fileupload[]" multiple>
С помощью некоторого Javascript при каждом изменении, внесенном в этот ввод, он добавляет список имен файлов + форматированную строку (захваченную из имени файла) внутри другого ввода, поэтому в нашем случае мы имеем макет, как показано ниже (при условии, что мы просто добавлены некоторые изображения):
Почти похоже на: http://jsfiddle.net/pxfunc/WWNnV/4/
// Представление HTML такого макета будет … (предполагая, что мы добавили 3 изображения)
<input type="file" name="fileupload[]" multiple>
<input type="text" value="Image Name 1" name="keyword[]">
<input type="text" value="Justsome File" name="keyword[]">
<input type="text" value="Some Img 031" name="keyword[]">
<input type="submit" value="Upload">
У меня это так, потому что, помимо загрузки файлов, я также хотел бы добавить их в свою базу данных с заголовком по умолчанию, основанным на его имени файла (и возможностью устанавливать / изменять этот заголовок для каждого изображения при его загрузке). Нет никаких проблем с моей формой.
ПРОБЛЕМА: Моя дилемма лежит внутри страницы PHP, на которой представлены данные / действие формы.
Я могу только обойтись:
Вот моя страница действий с PHP: (В настоящее время загружает правильные изображения, но имеет одинаковый заголовок для всех)
<?php // CONNECT TO DATABASE... // INCLUDE UPLOAD CLASS LIBRARY include (dirname(__FILE__).'/lib/class.upload.php'); $files = array(); foreach ($_FILES['fileupload'] as $k => $l) { foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $imagename = $_POST['keyword'][$i]; } } // create an array here to hold file names $uploaded = array(); foreach ($files as $file) { $generate_name = rand(100,99999); $generate_name_extra = rand(200,9999); $filenamex = "COVER_PHOTO_".$generate_name.$generate_name_extra."_".time(); $filenamex_thumb = $filenamex."_thumb"; $handle = new upload($file); if ($handle->uploaded) { $this_upload = array(); ///// 1 //////////////////////////////////////////////////////////////////// $handle->file_new_name_body = $filenamex_thumb; $handle->file_force_extension = true; $handle->image_resize = true; $handle->image_x = '300'; $handle->image_ratio_y = true; $handle->jpeg_quality = '100'; // ABSOLUTE PATH BELOW $handle->process($absoRoot.'covers/thumbs/'); //////////////////////////////////////////////////////////////////////////// if ($handle->processed) { // store the image filename $this_upload['image'] = $handle->file_dst_name; // Destination file name $this_upload['body'] = $handle->file_dst_name_body; // Destination file name body $this_upload['extension'] = $handle->file_dst_name_ext; // Destination file extension $category_id = $_POST['cat']; $hiddenvalues = explode ("|",$_POST["cat"]); $category = $hiddenvalues[0]; $category_name = $hiddenvalues[1]; $sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$imagename.'", "'.$category_name.'", "'.$category.'")'; mysql_query($sql); } $handle->clean(); header("Location: ./upload.php"); $message = ""; } else { echo ' file not uploaded to the wanted location'; echo ' Error: ' . $handle->error . ''; } } ?>
(Я использую класс загрузки Colin Verot для обработки загрузок изображений и учебник по ним, чтобы обрабатывать MULTIPLE загрузки изображений на этой странице, в разделе: Что можно сказать о нескольких загрузках? )
Это будет работать идеально, если бы я просто загружал изображения, однако я добавил функциональность добавления каждого изображения в мою базу данных. & Это – то, где это вводит в заблуждение.
Я уверен, что ключ размещает SQL-запрос внутри правого foreach или, возможно, делает еще один, но я пробовал это, и он дает мне только 1 хороший результат для загрузки изображения или названия, ни для обоих.
Мне нужно загрузить изображение на сайт, а затем сохранить его данные (включая путь к изображениям) в мою базу данных.
Пожалуйста, загляните в мой код и просветите меня, как решить эту проблему? Ключ фрагмента действительно был бы прекрасен, так как я уже очень смущен, попробовав все, что мог придумать. Спасибо огромное!
Когда вы собираете информацию о файле, вы переписываете $imagename
в каждый цикл, поэтому он будет назначен последнему. Попробуйте подключить его к переменной $files
(надеюсь, это не связано с классом upload
который вы используете).
foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $files[$i]['imagename'] = $_POST['keyword'][$i]; }
Затем обновите строку $sql
чтобы указать, что
$sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$file['imagename'].'", "'.$category_name.'", "'.$category.'")';
Вы не сохраняете переменную $ imagename в массив $ files, вы просто перезагружаете ее каждый раз.
$files[$i][$k] = $v; $imagename = $_POST['keyword'][$i];
Должно быть что-то вроде:
$files[$i][$k] = array($v, $_POST['keyword'][$i]); ... foreach ($files as $data) { list($file, $imagename) = $data; ... }
Я думаю, что одна из ваших проблем – ваш предлог:
$files = array(); foreach ($_FILES['fileupload'] as $k => $l) { foreach ($l as $i => $v) { if (!array_key_exists($i, $files)) $files[$i] = array(); $files[$i][$k] = $v; $imagename = $_POST['keyword'][$i]; } }
Итак, вы проходите через каждое из полей, присваивая их значение правильному файлу, который соответствует этой политике структуры:
_FILES => array( 'name' => array(0 => 'file.txt'), 'size' => array(0 => 235) )
Что правильно для мультифилей, но тогда вы это делаете:
$imagename = $_POST['keyword'][$i];
Что не выглядит правильным. Вы переписываете var каждый раз, когда последний просматривается, и это означает, что вы будете получать только один входной файл.