我在php中有以下代码:
if (isset($_FILES)) {
foreach($_FILES as $index => $picture)
{
echo $_FILES;
}
}
发布表单数据的JavaScript代码:
$(".update").click(function(){
$.ajax({
url: 'submit.php',
type: 'POST',
contentType:false,
processData: false,
data: function(){
var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file-'+i, file);
});
data.append('body' , $('#body').val());
return data;
}(),
success: function(result) {
alert(result);
},
error: function(xhr, result, errorThrown){
alert('Request failed.');
}
});
$('#picture').val('');
$('#body').val('');
});
html表单:
<form enctype="multipart/form-data" method="post" id="myform">
<textarea name="body" id="body" class="texarea" placeholder="type here">
</textarea>
<label for="photo" class="custom-file-upload">
<i class="fa fa-picture-o"style="font-size:20px;color:pirple;"></i>
</label>
<input id="file" name="picture[]" type="file" multiple/>
//this is my part of interest now
<label for="docs" class="docsmsg">
<i class="fa fa-file" style="font-size:20px;color:red;"></i>
</label>
<input id="docs" name="document[]" type="file" multiple/>
</form>
PHP代码不接收来自表单的具有特定名称属性的文件,但不接收任何文件,无论是照片,文档还是不同的名称。 if(isset($ _ FILES))
但是,这不是我想要的。在我的表单上,我想要两个甚至三个文件输入选项,就像上面那个一样,除了另一个只是上传文档而最后一个只上传像视频...注意我把注释放在哪里...说......“这是我感兴趣的一部分。”这是我想添加的新增内容。
目前只能上传照片...但我对三个文件输入选项感兴趣...一个用于照片,视频,文档。
最初我尝试使用这个PHP代码区分不同的东西:
if (isset($_FILES[file])) {
//do something
}
但这不起作用。它没有做'某事'。只有在我删除方括号末尾的[文件]描述之后,它才会开始执行上面提到的'某事'。
我的问题确实是,根据我想要实现的内容....对于不同类型的文件分别有多个多个文件输入,我如何允许php实际确定文件的哪个表单输入字段被附加或我想要处理哪些/哪些文件类型。 现在的代码是,文件被附加到哪个输入字段并不重要,但最后,如果(isset($ _ FILES))指令,它们都会到达那个....
答案 0 :(得分:2)
Hello_ mate,
首先我在这里看到一个错误if (isset($_FILES[file]))
这将永远不会有效,因为你需要像if (isset($_FILES['file']))
这样的引号。然后,当您发布表单时,数据将包含name
个属性而不是id
,因此如果您有 HTML :
<input id="file" name="picture[]" type="file" multiple/>
<input id="docs" name="document[]" type="file" multiple/>
在PHP
你会做:
if(isset($_FILES['picture'])){
foreach($_FILES['picture'] as $fileData){
// process your picture files here
}
}
if(isset($_FILES['document'])){
foreach($_FILES['document'] as $fileData){
// process your document files here
}
}
和不:
if(isset($_FILES['file'])){
}
if(isset($_FILES['docs'])){
}
我希望你明白这一点。祝你好运:)
注意强>
请记住,在检查type
属性时,您应手动验证文件类型。选择多个文件后,您将收到以下结构中的数据:
[picture] => Array
(
[name] => Array
(
[0] => icon.ico
[1] => some-png.png
)
[type] => Array
(
[0] => image/x-icon
[1] => image/png
)
[tmp_name] => Array
(
[0] => \tmp\php3F40.tmp
[1] => \tmp\php3F41.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 370070
[1] => 370070
)
)
所以你可以做这样的事情,例如:
$imgsAllowedTypes = array('image/jpeg', 'image/png', 'image/gif', 'image/bmp');
if(isset($_FILES['picture'])){
// This is an array of uploaded files
$pictures = $_FILES['picture'];
$fileNames = $pictures['name'];
foreach($fileNames as $k => $fileName){
// Here you can access other properties of the file by index - $k
$fileType = $pictures['type'][$k];
$tmpName = $pictures['tmp_name'][$k];
$error = $pictures['error'][$k];
$size = $pictures['size'][$k];
if(!in_array($fileType, $imgsAllowedTypes)){
// Invalid image
continue;
}
// upload
move_uploaded_file($tmpName, 'path/where/you/save/files/filename.extension');
}
}
修改强>
好的,现在感谢您的评论我可以承认我没有检查您的javascript
代码,当我没有检查时,我可以说它是错的,如果您想要我编写的代码片段工作你应该有以下javascript:
$.ajax({
type: 'POST',
cache: false,
contentType: false,
processData: false,
data: function () {
// Note the change is here
// You should have the same names set in the FormData object
// as you are waiting in the PHP script
var data = new FormData();
$.each($('#file')[0].files, function (i, file) {
data.append('picture[' + i + ']', file);
});
$.each($('#docs')[0].files, function (i, file) {
data.append('document[' + i + ']', file);
});
return data;
}(),
success: function (result) {
alert(result);
},
error: function (xhr, result, errorThrown) {
alert('Request failed.');
}
});
阅读评论了解详情
答案 1 :(得分:0)
正如前言一样,我相信contentType必须设置为&#39; multipart / form-data&#39;在AJAX请求中也是如此。
现在,关于PHP方面的问题。这实际上取决于你想要如何构建上传代码以及如何编写代码 - 这显然是非常明显的。
所以这就是我要做的事。
我们说我们有一个要上传文件的端点 - 我看到你没有在你的表单中给出一个,所以我将其命名为“upload.php”。为简单起见。
我有3种类型的字段。图片,文件和视频。 HTML标记非常简单。
<form method="POST" enctype="multipart/form-data">
<input type="file" name="picture[]" /> <!-- 1 or more -->
<input type="file" name="video[]" /> <!-- 1 or more -->
<input type="file" name="document[]" /> <!-- 1 or more -->
</form>
当然,您需要扩展这个非常基本的表单。可以复制每个输入字段以获得更多上传字段。
现在,到PHP。我将省略JavaScript,因为看起来你已经掌握了它。
<?php
if (empty($_FILES)) {
// We could output an error here if we like...
// Let's just end execution.
die();
}
// Will we process any pictures?
if (!empty($_FILES['picture'])) {
// Yes, we are processing a picture upload.
// _FILES[picture] is an array of arrays, let us iterate!
foreach ($_FILES['picture'] as $picture) {
// In here, we process each picture.
// Make sure the upload is ok
if ($picture['error'] !== UPLOAD_ERR_OK) {
// Process the error
}
// Before we save this, we should perform some MIME sniffing...
// I'll leave the implementation to you, just DON'T use picture['type'], as it is unreliable
$verified = false;
if (!$verified) {
// Note the error then break to continue processing other photos.
break;
}
// We should move the file to our uploads directory
move_uploaded_file($picture['tmp_name'], 'OUR_UPLOADS_DIR/myfile.jpg');
// Maybe here you can note a successful upload?
}
}
// How about some documents?
if (!empty($_FILES['document'])) {
foreach ($_FILES['document'] as $doc) {
// Here, we should basically do the same as with the picture.
// - Check for an error
// - Sniff the MIME type to ensure it's a safe file
// - Move the file
}
}
// Finally, we can do the same for the videos
if (!empty($_FILES['video'])) {
// You get the idea :)
}
// Now, we should actually output a response to the AJAX request,
// so we may notify the client of what actually happened.
// Success, or failure? I'll leave this up to you, to choose how
// best to communicate back to the client.
正如您所看到的,在PHP中处理文件非常简单。但要做得恰当,确实需要一些适当的基础。由于很多代码都非常相似,因此创建辅助函数而不是输入相同的代码3次可能很有用。