Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 访问使用Plupload上载的文件时出现问题_Php_File Upload_Plupload - Fatal编程技术网

Php 访问使用Plupload上载的文件时出现问题

Php 访问使用Plupload上载的文件时出现问题,php,file-upload,plupload,Php,File Upload,Plupload,我们正在使用一个多文件上传器插件,我们希望使用move_uploader_file()将其保存到服务器,并在成功上传后通过所有文件的直接链接发送邮件。我们得到以下数组 Array ( [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg [html5_uploader_0_name] => show_041.jpg [html5_uploader_0_status] => done

我们正在使用一个多文件上传器插件,我们希望使用move_uploader_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”]的位置传递什么。

感谢更新的帖子

当一个表单中有多个文件上载共享一个数组格式的元素名称时,
$\u FILES
会变得不可靠。而不是在表单元素名称和文件信息之间添加另一层

最好将其可视化:

array(
    'name' => array(
        0 => 'foo.gif',
        1 => 'bar.jpeg'
    ),
    'tmp_name' => array(
        0 => '/tmp/something',
        1 => '/tmp/else',
    )
);
不是你所期望的,对吧

现在,您的代码正在做一些完全荒谬的事情。您在
$\u POST
上循环,但随后您正在处理
$\u文件
。事情不是这样的

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

让我们假设
'file'
是多文件上传表单元素的名称,并完全重建
$\u FILES
数组:

(如果内部值不是数组,则此代码可能会失败--有关修复
$\u文件的其他选项,请参阅)

在那里。现在我们可以循环浏览
$fixed_文件
,就像我们从一开始就应该能够:

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\u name
。数组的name元素来自用户,不应被信任。正则表达式除去字母、数字、破折号、下划线和句点以外的任何内容


如果可以,您还应该对上传的数据进行更多验证例如,如果需要图像,则应尝试验证文件是否确实是图像。如果您使用的是PHP5.3,请查看。您可以使用它来检索文件的MIME类型,并确保它是您可以使用的文件类型。

感谢更新的帖子

当一个表单中有多个文件上载共享一个数组格式的元素名称时,
$\u FILES
会变得不可靠。而不是在表单元素名称和文件信息之间添加另一层

最好将其可视化:

array(
    'name' => array(
        0 => 'foo.gif',
        1 => 'bar.jpeg'
    ),
    'tmp_name' => array(
        0 => '/tmp/something',
        1 => '/tmp/else',
    )
);
不是你所期望的,对吧

现在,您的代码正在做一些完全荒谬的事情。您在
$\u POST
上循环,但随后您正在处理
$\u文件
。事情不是这样的

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

让我们假设
'file'
是多文件上传表单元素的名称,并完全重建
$\u FILES
数组:

(如果内部值不是数组,则此代码可能会失败--有关修复
$\u文件的其他选项,请参阅)

在那里。现在我们可以循环浏览
$fixed_文件
,就像我们从一开始就应该能够:

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\u name
。数组的name元素来自用户,不应被信任。正则表达式除去字母、数字、破折号、下划线和句点以外的任何内容


如果可以,您还应该对上传的数据进行更多验证例如,如果需要图像,则应尝试验证文件是否确实是图像。如果您使用的是PHP5.3,请查看。您可以使用它来检索文件的MIME类型,并确保它是您可以使用的文件类型。

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

为了更好地利用$\u POST数组输出,首先需要将表单Posts输出更改为多维数组/输出

我这样做的方式是改变plupload.js文件将html表单构造成多部分表单的位置。使用@Charles提到的以下PHP方法

下面我使用“[]”括号编辑的行的一个示例,“name”标记中的计数和值的名称将$\u 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') + '" />';

过帐后收到的输出存储在$\u POST中,您显示的数组来自该位置

为了更好地利用$\u POST数组输出,首先需要将表单Posts输出更改为多维数组/输出

我这样做的方式是改变plupload.js文件将html表单构造成多部分表单的位置。使用@Charles提到的以下PHP方法

下面我使用“[]”括号编辑的行的一个示例,“name”标记中的计数和值的名称将$\u 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') + '" />';

我看不出有任何多维性。@BoltClock:当有多个上传时,
$\u文件
数组会变成滥用的、愚蠢的多维性,尽管发布的数组显然不是
$\u文件
@seoppc,我想你忘了告诉我们你到底遇到了什么问题。@Charles我们想用move_uploaded_file()保存it服务器,我们如何使用这种类型的数组来保存它?@seoppc,我们能看看你现在的代码吗?你能解释一下代码中的错误吗?(请把它编辑成你的问题。)我看不到任何多维性。@BoltClock:当有多个上传时,
$\u文件
数组变得滥用、愚蠢的多维性,尽管显然发布的数组不是
$\u文件
@seoppc,我想你忘了告诉我们你到底遇到了什么问题。@Charles我们想用move_uploaded_file()保存it服务器,而我们如何使用这种类型的数组呢?@seoppc,我们能看看你现在的代码吗
    $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
    move_uploaded_file($targetDir . $_POST['tmpname'], $destination);