2012-04-19 55 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