【问题标题】:Trouble accessing files uploaded with Plupload无法访问使用 Plupload 上传的文件
【发布时间】:2011-07-22 08:42:36
【问题描述】:

我们正在使用多文件上传插件,我们希望使用 move_uploaded_file() 将其保存到服务器,并在成功上传后发送带有所有文件直接链接的邮件。我们正在获取以下数组...

Array
(
    [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg
    [html5_uploader_0_name] => show_041.jpg
    [html5_uploader_0_status] => done
    [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg
    [html5_uploader_1_name] => 23.jpg
    [html5_uploader_1_status] => done
    [html5_uploader_count] => 2
)

我们正在使用以下代码...

    $("#html5_uploader").pluploadQueue({
    // General settings
    runtimes : 'html5',
    url : 'upload.php',
    max_file_size : '10mb',
    chunk_size : '1mb',
    unique_names : true,
    filters : [
        {title : "Image files", extensions : "jpg,gif,png"},
        {title : "Zip files", extensions : "zip"}
    ],

    // Resize images on clientside if we can
    //resize : {width : 320, height : 240, quality : 90}
});

}

所以问题是如果是这个数组,我们应该在 $_FILES["file"]["tmp_name"] 和 $_FILES["file"]["name"] 的地方传递什么。

【问题讨论】:

  • 我没有看到任何多维度的东西。
  • @BoltClock:当有多个上传时,$_FILES 数组会变得粗暴、愚蠢地多维,但显然发布的数组不是 $_FILES
  • @seoppc,我想你忘了告诉我们你到底遇到了什么问题。
  • @Charles 我们想使用 move_uploaded_file() 将它保存在服务器上,我们如何使用这种类型的数组来做到这一点?
  • @seoppc,我们可以看看你现在拥有的代码吗?你能解释一下代码中出了什么问题吗? (请将其编辑到您的问题中。)

标签: php file-upload plupload


【解决方案1】:

您在发布后收到的输出存储在 $_POST 中,这是您显示的数组的来源。

为了更好地利用 $_POST Array 输出,您首先需要将 Form Posts 输出更改为多维数组/输出。

我这样做的方法是更改​​ plupload .js 文件将 html 表单构造为多部分表单的位置。使用@Charles 提到的以下 PHP 方法 multiple upload page in the PHP manual

我在下面编辑的行示例使用计数周围的“[]”括号和“名称”标签中的值名称,将 $_POST 数据拆分为多维数组。

    if (file.target_name) {
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][tmpname]" value="' + plupload.xmlEncode(file.target_name) + '" />';
    }

    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][name]" value="' + plupload.xmlEncode(file.name) + '" />';
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][status]" value="' + (file.status == plupload.DONE ? 'done' : 'failed') + '" />';

这会变成这样:

大批 ( [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg [html5_uploader_0_name] => show_041.jpg [html5_uploader_0_status] => 完成 [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg [html5_uploader_1_name] => 23.jpg [html5_uploader_1_status] => 完成 [html5_uploader_count] => 2 )

进入这个:

大批 '上传者' => 大批 0 => 大批 'tmpname' => 字符串'p15rkfr6oogdt1ln91t0r4obrrh3.jpg' '名称' => 字符串'show_041.jpg' '状态' => 字符串'完成' 'count' => 字符串'1'

然后您可以使用 Plupload 保存在“Upload.php”中找到的临时 (tmp) 文件的位置以及 tmpname $_POST['tmpname'] 来移动文件。

    $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
    move_uploaded_file($targetDir . $_POST['tmpname'], $destination);

【讨论】:

  • 希望这对使用 Plupload 的人有所帮助,因为这对我来说非常令人沮丧
【解决方案2】:

感谢您更新的帖子。

当有多个文件上传在一个表单中共享一个数组格式的元素名称时,$_FILES 会变得很不稳定。而不是在表单元素名称和文件信息之间添加另一层,it adds another layer after the file information

将其可视化可能会更好:

array(
    'name' => array(
        0 => 'foo.gif',
        1 => 'bar.jpeg'
    ),
    'tmp_name' => array(
        0 => '/tmp/something',
        1 => '/tmp/else',
    )
);

不是你所期望的,对吧?

现在,您的代码正在做一些完全荒谬的事情。您正在循环 $_POST,但随后您正在处理 $_FILES。事情不是这样的。

不知道你从哪里得到你发布的原始数组,所以我将忽略它。

假设'file' 是多文件上传表单元素的名称,完全重建$_FILES 数组

$fixed_files = array();
foreach($_FILES['file'] as $expected => $unexpected) {
    foreach($unexpected as $index => $data)
        $fixed_files[$index][$expected] = $data;
}

(如果内部值不是数组,则此代码可能失败 -- 请参阅 multiple upload page in the PHP manual 以获取修复 $_FILES 的其他选项。)

那里。现在我们可以循环遍历$fixed_files,就像我们从一开始就应该能够做到的那样:

foreach($fixed_files as $uploaded) {
    $safe_name = preg_replace('/[^A-Za-z0-9_-\.]/', '', $uploaded["name"]);
    move_uploaded_file($uploaded["tmp_name"], "upload/" . $safe_name);
    $links[] = "upload/" . $safe_name;
}

请注意对您之前的代码的新增内容——$safe_name。数组的名称元素来自用户,不应被信任。正则表达式除去字母、数字、破折号、下划线和句点以外的任何内容。

如果可以的话,您还应该对上传的数据进行更多验证!例如,如果您需要图片,您应该尝试验证文件确实是图片。如果您使用的是 PHP 5.3,请查看 finfo_file。您可以使用它来检索文件的 MIME 类型,并确保它是您可以使用的文件类型。

【讨论】:

  • @charles 感谢提供的代码,但我认为这不能解决我们的问题,我们的多文件上传器发送数组,正如我在上面发布的那样。因此,我们希望为 move_uploaded_file 的每个值付费
  • @seoppc,你能得到一个print_r($_FILES),然后用输出编辑你原来的问题吗?我发现您的 Javascript 上传小部件 不太可能改变 PHP 中的任何内容。看起来您正在使用 Plupload,它的 PHP 代码绝对为零。我希望原始的$_FILES 就像我上面描述的那样。我知道这一点是因为我也使用 Plupload。 :)
  • @Charles 是的,我正在使用 plupload。你能提供我上传plupload的代码吗
  • 请看the Custom Uploader examplebind 关注FileUploaded -- 上传脚本的响应将在回调的第三个参数中,在该示例中未显示.
  • @seoppc,我不会为你编写代码。到目前为止我编写的代码和我的 cmets 中提供的示例链接应该足以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2012-04-24
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多