是否可以通过ajax请求发送大于1MB的文件?

时间:2019-07-09 09:26:03

标签: javascript php ajax

我正在尝试发送大于1mb的文件,如果我使用html表单操作发送请求,则文件大小没有问题。但是,如果我尝试在php中使用ajax发送这些文件,则如果文件大小总计1mb或更大,则会在$ _FILES中显示错误。

我的php.ini默认设置为:

php_value upload_max_filesize 2G
php_value post_max_size 2G
php_value max_input_time 300
php_value max_execution_time 300

我在这里用ajax发送数据:

let formData = new FormData();

for (let i = 0; i < fileInput.files.length; i++) {
    formData.append('files[]', fileInput.files[i], fileInput.files[i].name);
}

let xhr = new XMLHttpRequest();
xhr.open('POST', '../upload.php', true);
xhr.send(formData);

在upload.php中,我只是在做

echo "<pre>";
print_r($_FILES['files']);
echo "</pre>";

如果文件1MB或更大,则会显示这种文件错误

Array
{
  [name] => Array
    (
        [0] => image.jpg
    )

  [type] => Array
    (
        [0] => 
    )

  [tmp_name] => Array
    (
        [0] => 
    )

  [error] => Array
    (
        [0] => 3
    )

  [size] => Array
    (
        [0] => 0
    )

)

3 个答案:

答案 0 :(得分:0)

您的html表单

            <form  name="fileInfoForm" class="form-horizontal" id='fileInfoForm' 
            method="post"  enctype="multipart/form-data">
            <input type="file"   id='file'   name='file' model="ctrl.fileInfo.file"
             placeholder='Choose file'   />
            </form>

您的ajax代码在此处将更多15 mb文件发送到php脚本

<script>
    $('#form').submit(function (e) {
        e.preventDefault();     
        var file=$("#file").val().split("\\").pop();
        var form=document.getElementById('fileInfoForm');
        var fd=new FormData(form);
        fd.append('file',file);
        $.ajax({
            type: "POST",
            enctype: 'multipart/form-data',

            url: 'your_file.php',
            data: fd,
            dataType: "json",
            processData: false,
            contentType: false,
            cache: false,
            success: function (data) {
            }


        })
    });
</script>

答案 1 :(得分:0)

按钮单击事件使用id获取输入类型文件prop并生成表单数据

// On button click event
    $('#upload').on('click', function() {
        var file_data = $('#fileToUpload').prop('files')[0];   
        var form_data = new FormData();                  
        form_data.append('file', file_data);
        $.ajax({
            url: 'server_file.php',
            dataType: 'json', 
            cache: false,
            contentType: false,
            processData: false,
            data: form_data,                         
            type: 'post',
            beforeSend: function (){
                // ...
            },
            success: function(response){
                console.log(response);
            },
            error: function(response){
                var response = response.responseJSON;
                console.log(response);
            }
        });
    });

在服务器上:

echo "<pre>";

print_r($_FILES);

答案 2 :(得分:0)

它是用于laravel框架的,但是ajax请求在每个地方都是相同的,我只想向您展示,一旦在表单标签中包含enctype="mulitpart/form-data",就可以了。然后,您也使用了类似方括号的数组。像文件name="file[]",然后什么也不做,我的意思是说它为您提供了所有带有数组索引的文件。在这种情况下,我不会遇到任何最大文件大小错误等问题……这只是为了您的帮助。

$(document).on('click','#hide_btn', function(e){
        e.preventDefault();

        var formData = new FormData(this.form);

        //$.ajaxSetup({
        //    headers: {
        //        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
        //    }
        //});

        $.ajax({
            method: 'POST',
            url: '{{ route("visa.store") }}',
            cache: false,
            contentType: false,
            processData: false,
            data: formData,

            success: function(data){
                console.log(data);
            },

            error: function(data){
                console.log(data);
            }
        });
    });