2012-04-19 54 views
0

我想從php腳本上傳文件(imageupload.php)的一個頁面中檢索文件名,並且我想在JavaScript函數(QandATable.php)內的另一個頁面中顯示它)。但我不知道如何做到這一點我得到一個未定義的變量

我會告訴你所有的相關代碼,所以你可以關注它,所以你能夠理解發生了什麼。

更新:下面我將向您展示如何上傳文件的步驟。下面的代碼成功上傳文件。

下面是表格(QandATable.php);

var $fileImage = $("<form action='imageupload.php' method='post' enctype='multipart/form-data' target='upload_target' onsubmit='return imageClickHandler(this);' class='imageuploadform' >" + 
<label>Image File: <input name='fileImage' type='file' class='fileImage' /></label><br/><label class='imagelbl'>" + 
"<input type='submit' name='submitImageBtn' class='sbtnimage' value='Upload' /></label>" + 
"</p><ul class='listImage' align='left'></ul>" + 
"<iframe class='upload_target' name='upload_target' src='#' style='width:0;height:0;border:0px;solid;#fff;'></iframe></form>"); 

在同一個頁面,當用戶提交表單時,它會在下面的函數,它將檢查確認,然後當確認是明確的,它會去到startImageUpload()功能:

function imageClickHandler(imageuploadform){ 
     if(imageValidation(imageuploadform)){ 
      return startImageUpload(imageuploadform); 
     } 
     return false; 
    } 

如果沒有驗證,它將進入下面的隱藏文件輸入的JS函數(QandATable.php),它會將表單提交到發生文件上傳的imageupload.php。當文件上傳時,它會回調stopImageUpload()函數(QandAtable.php),它會顯示有關文件是否已上傳的消息,並且這是我希望服務器上的文件名稱爲追加。

下面是startImageUpload()函數:

var sourceImageForm; 

function startImageUpload(imageuploadform){ 

$(imageuploadform).find('.fileImage').css('visibility','hidden'); 
sourceImageForm = imageuploadform; 

return true; 
     } 

下面是PHP腳本在那裏上傳文件(imageupload.php):

<?php 

    session_start(); 

    $result = 0; 

    if(file_exists("ImageFiles/".$_FILES['fileImage']['name'])) { 
     $parts = explode(".",$_FILES['fileImage']['name']); 
     $ext = array_pop($parts); 
     $base = implode(".",$parts); 
     $n = 2; 

     while(file_exists("ImageFiles/".$base."_".$n.".".$ext)) $n++; 
     $_FILES['fileImage']['name'] = $base."_".$n.".".$ext; 

     move_uploaded_file($_FILES["fileImage"]["tmp_name"], 
     "ImageFiles/" . $_FILES["fileImage"]["name"]); 
     $result = 1; 

    } 
     else 
      { 
      move_uploaded_file($_FILES["fileImage"]["tmp_name"], 
      "ImageFiles/" . $_FILES["fileImage"]["name"]); 
      $result = 1;  

      } 

    ?> 

    <script language="javascript" type="text/javascript"> 
window.top.window.stopImageUpload(<?php echo $result;?>); 
</script> 

最後,當上傳完成後,又回到stopUploadImage()函數(QandATable.php)顯示文件是否成功上傳的消息。這也是我希望追加從服務器上傳的文件名的地方。

function stopImageUpload(success){ 

      var result = ''; 
      if (success == 1){ 
result = '<span class="msg">The file was uploaded successfully!</span><br/><br/>'; 
      $('.listImage').append('<br/>'); 
      } 
      else { 
result = '<span class="emsg">There was an error during file upload!</span><br/><br/>'; 
      } 

    return true; 

    } 
+0

我看到的第一件事是在這個'var fileimagename = <?php echo $ fileimagename; ?>; '嘗試'var fileimagename ='<?php echo $ fileimagename; ?>'; ' – Dale 2012-04-19 12:34:25

+0

本來很高興看到輸出JavaScript代碼的樣子。 – 2012-04-19 12:35:24

+0

@Dale仍然一樣,仍然得到未定義的變量 – user1341521 2012-04-19 12:38:53

回答

2

$_POST將不包含fileimagename。相反,您的表單輸入被稱爲fileImage。就用它來:

// Check $_POST for fileImage, which was the form input name 
if (isset($_POST['fileImage'])) { 
    $_SESSION['fileimagename'] = $_FILES['fileImage']['name']; 
    // Proceed with the file upload and save. 
} 
else { 
// oops, can't proceed 
} 

在JavaScript頁面,做一些錯誤訪問時的值檢查:

<?php 
session_start(); 
if (isset($_SESSION['fileimagename'])) { 
    $fileimagename = $_SESSION['fileimagename']; 
    // output JS code... 
?> 
<script type="text/javascript">Your JS code here...</script> 
<?php 
} 
else { 
    // No filename - can't proceed with JavaScript code 
    // Display an eror or a message with instructions for user... 
} 

注:不要使用用戶提供的文件名保存圖像!它會向您提供目錄遍歷攻擊,並使用戶可以在Web服務器可寫入的文件系統的任何位置寫入文件。

// This is unsafe! 
move_uploaded_file($_FILES["fileImage"]["tmp_name"], "ImageFiles/" . $_FILES["fileImage"]["name"]); 

相反,它常用於從$_FILES['fileImage']['name']值存儲在數據庫中,與實際的文件標識符值一起,並使用標識符將其存儲在磁盤上。

$info = pathinfo($_FILES['fileImage']['name']); 
// Get the original extension 
$filext = $info['extension']; 
// Make a unique filename and add the extension 
$stored_filename = uniqid() . $filext; 

// Use that to store the file on disk 
move_uploaded_file($_FILES["fileImage"]["tmp_name"], $stored_filename); 

// Now store BOTH $_FILES['fileImage']['name'] and $stored_filename in your database together 
// The original user-supplied filename can be used for display, but isn't used on disk 
+0

嗨,當你說不使用用戶提供的文件名,你是什麼意思,你能提供一個更安全的方式來更改該代碼行的例子? – user1341521 2012-04-19 12:50:36

+0

@ user1341521剛剛完成上面的添加... – 2012-04-19 12:51:13

+0

感謝您讓上傳更安全。我已經更新了我的問題和代碼,發生了什麼是沒有未定義的索引錯誤了,但我現在得到一個錯誤,指出無效的正則表達式標誌w?這是什麼意思?問題已更新,以提供更多信息。 – user1341521 2012-04-19 13:09:09