2012-04-26 3 views
5

Я построил этот мастер веб-форм, состоящий из нескольких страниц PHP. На нескольких страницах пользователи могут заполнить форму, и данные временно сохраняются в сеансе, а на последней странице сеансы используются для хранения всех данных в базе данных MYSQL. Все работает отлично, за исключением загруженного файла. Вот мой код:Как сохранить загрузку фотографий в сеансе PHP?

HTML: wizard_page2

<form name="registratieformulier" method="post" enctype="multipart/form-data" action="sw3.php"> 

    <tr><td>Foto winkel uploaden: </td><td><input type="file" name="uploadfoto"/></td></tr><br /><br /> 

     <tr><td><strong>Omschrijving van winkel:</strong></td>     </tr><br /> 

     <tr><textarea cols="50" rows="7" name="omschrijvingwinkel"></textarea></tr> 
     <input name="pkbedrijven" value="<?php echo($pkbedrijven); ?>" type="hidden" /> 
    <input type="submit" name="stuurfoto" value="Verzenden" /> 

</form> 

PHP: wizard_last_page

$_FILES['uploadfoto']['name']  = $_SESSION["naamfoto"]; 
    $_FILES['uploadfoto']['tmp_name'] = $_SESSION["tijdelijk"]; 

    $bn = $_SESSION["wn"]; 

    $target_path = "../../winkels/$bn/"; 

     $target_path = $target_path . basename($_FILES['uploadfoto']['name']); 


    move_uploaded_file($_FILES['uploadfoto']['tmp_name'], $target_path)or die("There was an error uploading the file, please try again!"); 
    $foto_path = "http://mywebsite.nl/winkels/$bn/".basename($_FILES['uploadfoto']['name']); 


    $omschrijving = $_SESSION["omschrijving"]; 

    $add = "UPDATE winkelprofiel SET winkelomschrijving='$omschrijving', winkelfoto='$foto_path' WHERE fkBedrijvenID=$pkbedrijven "; 
    $query_upload = mysql_query($add) or die("De winkelfoto en omschrijving konden niet worden opgeslagen"); 

ответ

7

$_FILES массив содержит только информацию о файле, который был загружен в запросе. Если вы не сохраните этот файл в другом месте в рамках одного и того же запроса, он будет удален PHP в конце запроса. Вы не можете просто сохранить $_FILES['uploadfoto']['tmp_name'] в сеанс и ожидать, что файл все равно будет там позже, потому что его не будет. Также нет смысла назначать значения в $_SESSION обратно в $_FILES, это не приведет к возврату файла.

Что вам нужно сделать:

  1. если загрузка прошла успешно, двигаться $_FILES['uploadfoto']['tmp_name'] куда-то сразу
  2. сохранить местоположение вы переместили его в $_SESSION
  3. сделать что-то с этим файлом в $_SESSION в конце вашего многостраничного процесса (нет необходимости в $_FILES больше)
  4. есть механизм для удаления старых загруженных файлов, если пользователь откажется от сеанса и файл nev er используется
+0

какую функцию вы бы посоветовали использовать для перемещения файла rename() или copy()? –

+1

'move_uploaded_file' – deceze

3

Я думаю, что проблема в том, что файл, расположенный в $ _FILES ['uploadfoto'] ['tmp_name'], будет доступен только при его загрузке. Даже вы сохраняете значение в сеансе, файл не будет появляться, когда вы попадете на страницу wizard_last_page. Вам нужно обрабатывать загруженные файлы сразу в запросе POST.

Поэтому вам нужно переместить файл в $ target_path или любое определенное временное место при его загрузке, а затем сохранить $ target_path в сеансе, чтобы вы могли получить доступ к файлу позже на странице wizard_last_page.

+0

Какую функцию вы бы посоветовали использовать для перемещения файла rename() или copy()? –

+0

Я бы переименовал() для перемещения файла, так как copy() копирует исходный файл. – mask8

1

Да, вы можете загрузить этот файл в одно временное местоположение. Затем на последней странице, после отправки формы, вы можете перенести файл в нужное место, а затем удалить временный.

$_SESSION['file'] = $_FILES["file"]["name"]; 

if (file_exists("uploads/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/temp/" . $_FILES["file"]["name"]); 
     }; 


//This for the last page. 
$file = file_get_contents("uploads/temp/".$_SESSION['file']); 
file_put_contents("uploads/".$_SESSION['file'], $file); 
1

Я не согласен с принятым ответом. Существует способ хранения всех изображений в переменной массива сеансов. Вы можете использовать функцию «file_get_contents» для хранения данных изображения. Посмотрите на это:

$_SESSION['imgArrayFile'][] = $_FILES['file']; //Your file infromations 
    $_SESSION['imgArrayName'][] = $_POST["ImgNewNamePlacowki"]; //new name for img 
    $_SESSION['ImgArrayAlt'][] = $_POST["ImgAltPlacowki"]; // alt tags if you use them 
    $_SESSION['obj_image_session'][] = file_get_contents($_FILES['file']['tmp_name']); 
    //above "file_get_contents" function - store image as a long string. 

Независимо от того, что другие думают об использовании его для этой цели он может сделать эту работу за вас. Существует несколько проблем с хранением больших данных в сеансе, но если ваши изображения достаточно малы, и вы знаете об ограничении настроек, тогда вы будете в порядке.

Сохраните файл с

$file= $destination."/".$filename; //images/new.jpg 
$fp=fopen($file,"w"); 
fwrite($fp,$_SESSION['obj_image_session'][$index]); 

примером из (РАБОЧЕГО) ПРОЕКТА:

<?php 
//$galery_img_folder = "your/new/image/destination"; 

foreach($_SESSION['imgArrayFile'] as $index => $name){ 
    if($_SESSION['imgArrayName'][$index]!="" 
    && $_SESSION['ImgArrayAlt'][$index]!="" 
    && $_SESSION['obj_image_session'][$index]!="" 
){ 

    $allowedExts = array("gif", "jpeg", "jpg", "png"); 
    $temp = explode(".", $_SESSION['imgArrayFile'][$index]["name"]); 
    $extension = end($temp); 
    if ((($_SESSION['imgArrayFile'][$index]["type"] == "image/gif") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/jpeg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/jpg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/pjpeg") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/x-png") 
    || ($_SESSION['imgArrayFile'][$index]["type"] == "image/png")) 
    && ($_SESSION['imgArrayFile'][$index]["size"] < 104857600) 
    && in_array($extension, $allowedExts)) 
     { 
      if(isset($_SESSION['imgArrayName'][$index]) && $_SESSION['imgArrayName'][$index]!=""){ 
      $rename = $_SESSION['imgArrayName'][$index]; 
      $rename = $rename.".".end($temp); 
     } 

     if ($_SESSION['imgArrayFile'][$index]["error"] > 0) 
     { 
     echo "Return Error Code: " . $_SESSION['imgArrayFile'][$index]["error"] . "<br>"; 
     } 
     else 
     { 
     $size = display_filesize($_SESSION['imgArrayFile'][$index]["size"]); 
     echo "Upload: " . $_SESSION['imgArrayFile'][$index]["name"] . "<br>"; 
     echo "Type: " . $_SESSION['imgArrayFile'][$index]["type"] . "<br>"; 
     echo "Size: " . ($size) . "<br>"; 
     echo "Temp file: " . $_SESSION['imgArrayFile'][$index]["tmp_name"] . "<br>"; 

     if (file_exists($galery_img_folder."/".$rename)) 
      { 
      $error[] = ''.$rename.' <span class="error" id="error"> this name exsists </span>'; 
      } 
     else 
      { 
      $_FILES["file"]["tmp_name"]=$_SESSION['imgArrayFile'][$index]["tmp_name"]; 
      move_uploaded_file($_FILES["file"]["tmp_name"], $galery_img_folder."/".$rename); 
      //now make use of the file_get_content variables 
      $file= $galery_img_folder."/".$rename; 
      $fp=fopen($file,"w"); 
      fwrite($fp,$_SESSION['obj_image_session'][$index]); 
     } 
      } 
     } 
     } 
    else 
     { 
     $error[] = '<span class="error" id="error"> Niewłaściwy plik </span>'; 
     $maxsixe = display_filesize(104857600); 
     echo "Size: " . ($maxsixe) . "<br>"; 
     } 
    } 
    }//end foreach ! ! ! 
}//end dodawanie zdjecia 
?> 

Конечно, вам придется сделать некоторые небольшие изменения, чтобы заставить его работать с вашим проектом, но мой Это должно было показать вам, что это возможно.

Имейте большой день и счастливое кодирование!

+0

Если у вас есть вопросы ... дайте мне знать. – DevWL

Смежные вопросы