0

我们正在使用多文件上传插件,我们希望使用 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"] 的地方传递什么。

4

2 回答 2

3

感谢您更新的帖子。

当一个表单中有多个文件上传共享一个数组格式的元素名称时,$_FILES就会变得很奇怪。它不是在表单元素名称和文件信息之间添加另一层,而是在文件信息之后添加另一层

将其可视化可能会更好:

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;
}

(如果内部值不是数组,此代码可能会失败 - 请参阅PHP 手册中的多次上传页面以获取其他修复选项$_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 类型,并确保它是您可以使用的文件类型。

于 2011-03-24T19:26:43.030 回答
0

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

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

我这样做的方法是更改​​ plupload .js 文件将 html 表单构造为多部分表单的位置。正如@Charles 所提到的,在 PHP 手册中使用以下 PHP 方法多个上传页面。

我在下面编辑的行示例使用计数周围的“[]”括号和“名称”标签中的值名称,将 $_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);
于 2013-06-01T21:00:57.100 回答