2012-04-26 42 views
5

Tôi đã xây dựng trình hướng dẫn biểu mẫu web này, bao gồm một số trang PHP. Trong một số trang này, người dùng có thể điền vào biểu mẫu và dữ liệu được lưu tạm thời trong một phiên và ở trang cuối cùng các phiên được sử dụng để lưu trữ tất cả dữ liệu trong cơ sở dữ liệu MYSQL. Mọi thứ hoạt động tốt với ngoại lệ của tệp được tải lên. Đây là mã của tôi:Làm thế nào để lưu trữ hình ảnh tải lên trong một phiên 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"); 

Trả lời

7

Mảng $_FILES chỉ chứa thông tin về các tập tin đã được tải lên trong yêu cầu này. Nếu bạn không lưu tập tin đó ở nơi khác trong cùng một yêu cầu, nó sẽ bị loại bỏ bởi PHP ở cuối yêu cầu. Bạn không thể chỉ đơn giản là tiết kiệm $_FILES['uploadfoto']['tmp_name'] vào phiên và mong đợi các tập tin vẫn còn ở đó sau đó, bởi vì nó sẽ không được. Cũng không có điểm nào trong việc gán các giá trị trong $_SESSION trở lại vào $_FILES, nó sẽ không mang lại tệp.

Những gì bạn cần làm:

  1. nếu upload thành công, di chuyển $_FILES['uploadfoto']['tmp_name'] ở một nơi khác ngay lập tức
  2. lưu vị trí bạn đã di chuyển nó đến vào $_SESSION
  3. làm điều gì đó với tập tin trong $_SESSION ở cuối quá trình nhiều trang của bạn (không cần $_FILES nữa)
  4. có một số cơ chế để xóa các tệp đã tải lên cũ, trong trường hợp người dùng từ bỏ phiên và tệp nev er được sử dụng
+0

bạn sẽ sử dụng chức năng nào để di chuyển đổi tên tệp() hoặc sao chép()? –

+1

'move_uploaded_file' – deceze

3

Tôi nghĩ rằng vấn đề là, tệp có giá $ _FILES ['uploadfoto'] ['tmp_name'] sẽ chỉ khả dụng khi được tải lên. Ngay cả khi bạn lưu trữ giá trị trong phiên, tệp sẽ không ở đó khi bạn truy cập vào wizard_last_page. Bạn cần xử lý các tệp đã tải lên ngay trong yêu cầu POST.

Vì vậy, bạn cần chuyển tệp sang $ target_path hoặc bất kỳ vị trí tạm thời nào đó khi được tải lên, sau đó lưu $ target_path trong phiên để bạn có thể truy cập tệp sau này trên wizard_last_page.

+0

Bạn sẽ sử dụng lời khuyên nào để di chuyển tên tệp() hoặc sao chép()? –

+0

Tôi muốn đổi tên() để di chuyển tệp, vì copy() tạo bản sao của tệp nguồn. – mask8

1

Vâng, trước hết bạn có thể tải tệp lên ở một vị trí tạm thời. Sau đó, trên trang cuối cùng, khi bạn gửi biểu mẫu, bạn có thể chuyển tệp đến vị trí mong muốn rồi xóa tệp tạm thời.

$_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

Tôi không đồng ý với câu trả lời được chấp nhận. Có một cách để lưu trữ tất cả các hình ảnh trong biến mảng phiên. Bạn có thể sử dụng chức năng "file_get_contents" để lưu trữ dữ liệu hình ảnh. Có xem xét này:

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

Bất kể những gì khác nghĩ về việc sử dụng nó cho mục đích này nó có thể thực hiện công việc cho bạn. Có một số vấn đề với việc lưu trữ dữ liệu lớn trong phiên nhưng nếu hình ảnh của bạn đủ nhỏ và bạn nhận thức được giới hạn cài đặt của mình, thì bạn sẽ ổn.

Lưu tập tin của bạn với

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

VÍ DỤ TỪ MỸ (LÀM VIỆC) DỰ ÁN:

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

Tất nhiên bạn sẽ phải thực hiện một số thay đổi nhỏ để làm cho nó làm việc với các dự án của bạn, nhưng tôi điểm là để cho bạn thấy rằng điều này là có thể.

Có một ngày tuyệt vời và mã hóa vui vẻ!

+0

Nếu bạn có bất kỳ câu hỏi nào ... hãy cho tôi biết. – DevWL

Các vấn đề liên quan