将不同的文件类型发布到php文件

时间:2017-04-13 06:42:17

标签: javascript php jquery forms

我在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))指令,它们都会到达那个....

2 个答案:

答案 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次可能很有用。