【问题标题】:Unable to Upload the file using Uploadify script无法使用 Uploadify 脚本上传文件
【发布时间】:2010-09-04 22:07:26
【问题描述】:

我正在使用 Uploadify 插件来上传文件。尽管这可能是一个非常基本的问题,但我无法理解和实施以使其能够上传文件。

我想使用uploadify实现以下目标

当用户选择文件时,我希望使用 PHP 将其直接上传到目标路径。

现在我正在使用以下代码。

<html>
<head>
<link rel="stylesheet" href="css/uploadify.css" type="text/css" />
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/jquery.uploadify.v2.1.0.min.js"></script>
<script type="text/javascript" src="js/swfobject.js"></script>
</head>

<script type="text/javascript">
$(document).ready(function() {
    $('#someID').uploadify({ 
      'uploader': 'img/uploadify.swf',
      'script': 'uploadify.php',
      'folder': 'upload',
      'cancelImg': 'img/cancel.png',
      'auto': 'true',
      'fileDesc': 'jpg/jpeg',
      'displayData': 'percentage',
      'fileExt': "*.jpg;*.jpeg",
      'sizeLimit' : '8388608'
      }); }); 
      </script>

<body>
<form id="someID" action="uploadify.php" method="post" enctype="multipart/form-data"> 
<input type="file" name="file" id="fileUpload1"/>
<p><input type="submit" name="submit" value="Upload" /></p> 
</form>
</body>

这是uploadify.php的代码

if (!empty($_FILES)) {
    $tempFile = $_FILES['file']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
    $targetFile =  str_replace('//','/',$targetPath) . $_FILES['file']['name'];
    move_uploaded_file($tempFile,$targetFile);
        echo "1";

我只想上传一个文件。我需要为此包含 check.php 吗?当用户选择图像文件时,我该如何制作它直接执行操作并移动到指定目录。

P.S:我对 javascript 和 jquery 有非常基本的了解。 :)

注意:文件上传问题现已解决。

如何限制用户上传 一个按钮上只有一个文件,我想要 比如当用户选择 文件并上传该按钮 应该禁用什么的

编辑:为了限制用户在按钮中上传多个文件,我添加了此代码,当用户选择多次时,它仍在上传许多文件。这是我的代码。

<script type="text/javascript">
$(document).ready(function() {
    $('#someID').uploadify({ 
      'uploader': 'img/uploadify.swf',
      'script': 'uploadify.php',
      'folder': 'upload',
      'cancelImg': 'img/cancel.png',
      'auto': 'true',
      'fileDesc': 'jpg/jpeg',
      'displayData': 'percentage',
      'fileExt': "*.jpg;*.jpeg",
      'sizeLimit' : '8388608',
      'fileDataName' : 'file',
      onSelect : function(){
           $("#someID input").attr("disabled", true);
      }
      }); }); 
      </script>

这有什么问题?

【问题讨论】:

    标签: php jquery


    【解决方案1】:

    几周前我正在为此争论不休。您需要更改 fileDataName 属性。默认为Filedata。您正在尝试以 file 在此部分中访问它:$_FILES['file']

    要么将$_FILES['file'] 的所有实例更改为$_FILES['Filedata'],要么将此属性添加到您的$('#someID').uploadify({}); 属性集合中:fileDataName:'file'

    如果您正在寻找嵌入式修复,只需在您的 JavaScript 中进行此更改:

    $(document).ready(function() {
        $('#someID').uploadify({ 
          'uploader': 'img/uploadify.swf',
          'script': 'uploadify.php',
          'folder': 'upload',
          'cancelImg': 'img/cancel.png',
          'auto': 'true',
          'fileDesc': 'jpg/jpeg',
          'displayData': 'percentage',
          'fileExt': "*.jpg;*.jpeg",
          'sizeLimit' : '8388608',
          'fileDataName' : 'file'
          }); 
    }); 
    

    注意'fileDataName' : 'file'

    限制一次上传(当然,只要页面不刷新):

    把你的 JavaScript 改成这样:

    $(document).ready(function() {
        $('#someID').uploadify({ 
          'uploader': 'img/uploadify.swf',
          'script': 'uploadify.php',
          'folder': 'upload',
          'cancelImg': 'img/cancel.png',
          'auto': 'true',
          'fileDesc': 'jpg/jpeg',
          'displayData': 'percentage',
          'fileExt': "*.jpg;*.jpeg",
          'sizeLimit' : '8388608',
          onSelect : function(){
               $("#someID input").attr("disabled", true);
          }}); 
    }); 
    

    只要知道如果用户刷新页面,按钮将再次启用,允许他们上传另一个文件。他们也可以手动重新启用它。因此,请添加服务器端检查以确保如果您不希望他们上传其他文件,他们不会上传其他文件。

    【讨论】:

    • 哇,完美运行,它正在移动文件。现在我如何限制用户在一个按钮上仅上传一个文件,我想要像当用户选择文件并上传该按钮时应该禁用该按钮或其他东西
    • 我在答案中加了一个例子
    • 我尝试使用该代码,它仍然能够上传许多文件。我正在更新上面的代码,请看一下。我哪里出错了。
    • 您可能已经注意到带有#someID 的原始文件输入标记被隐藏,并在页面准备就绪时被一个对象替换。因此,我认为,当您再次尝试禁用文件 #someID 时,它不起作用。您必须改为禁用该对象。
    • 在我的最后一条评论中更正...“带有#someID 的原始文件输入标签被隐藏,当页面准备好时,一个带有#fileUploader 的对象被添加到它旁边。”检查$("object#fileUploader").attr("display","none"); 是否有效?然后你可以在那里插入一个褪色的文件上传按钮来模拟文件输入禁用操作。我认为这对我不起作用。所以,我编辑了 jquery 库的代码,它插入了object#fileUploader。我没有在文件输入标签旁边添加,而是让它出现在div#holder 中。然后我做了$(div#holder").attr(innerHTML,"")
    【解决方案2】:

    需要考虑的几点:

    1. 检查$_FILES 的存在不是确认上传的正确方法。如果上传因任何原因失败(文件太大、连接中断、磁盘空间不足等),仍然会有一个$_FILES 数组。你需要做一些类似\

      的事情

      if ($_FILES['nameoffield']['error'] === UPLOAD_ERR_OK) 代替。

      错误常量在这里定义:http://ca.php.net/manual/en/features.file-upload.errors.php

    2. 您的路径构建代码将您的服务器完全打开到基于文件的远程接管:您在路径中盲目使用$_REQUEST['folder']。如果有人颠覆了表单并将文件夹设置为../../../../../../../../some/nasty/place/on/your/system怎么办?
    3. 没有碰撞检测,因此您的脚本很乐意用上传的文件覆盖现有文件
    4. 你不检查move_uploaded_file() 是否真的成功了。如果由于某种原因无法移动文件,它将返回布尔值FALSE。你只是盲目地回显一个 '1' 来通知客户端 JavaScript 发生了一些事情。

    【讨论】:

    • 如何防止有人滥用安全漏洞 #2? (没有讽刺的意思,我只是好奇)。你会检查路径的父级吗?
    • 仅供参考,这是我的第一个 jquery 脚本,它纯粹用于测试,我确实有一个代码可以检查各种错误,例如 (file_exists),以防万一,它在移动之前重命名文件,它检查文件尺寸等。我正在寻找解决方案,因为我想在我的自定义 CMS 中实现 Uploadify。顺便说一句,谢谢你的提示,我从中学到了一些东西.. :)
    • 我猜你可以从路径中过滤../
    • 最好不要让用户指定路径。将用户提供的任何东西(包括上传的文件本身)都视为有毒废物,并确保您在处理这些文件时穿戴了全套危险品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2015-12-19
    相关资源
    最近更新 更多