Php 访问使用Plupload上载的文件时出现问题
我们正在使用一个多文件上传器插件,我们希望使用move_uploader_file()将其保存到服务器,并在成功上传后通过所有文件的直接链接发送邮件。我们得到以下数组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
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);