javascript - 使用 jQuery 上传非拉丁名称文件

标签 javascript php jquery

我有简单的表单来将文件上传到服务器。

这是输入事件监听器:

$(document).on('change', '.js-file', function(event){

    sendFile(event);
});

这是实际上传文件的函数:

function sendFile (event) {
    var files = event.target.files;


    var action = '/ajax-upload-files/';
    var data = new FormData();

    $.each(files, function(key, value)
    {
        data.append(key, value);
    });

    $.ajax({
        url: action,
        type: 'POST',
        data: data,
        cache: false,
        dataType: 'json',
        processData: false,
        contentType: false,
        success: function(data){

        },
        complete: function(data) {
        }
    });
}

它适用于所有类型的文件,除了文件名中包含非拉丁字符的文件,例如Максим.jpg

数据正在发送到服务器,正如我在 Chrome 网络中看到的那样。但是当我尝试将 $_FILES 转储到服务器上时,它似乎是空的。

var_dump($_FILES) //array(0) {}

我真的不明白出了什么问题 - 请求 header 的 contentLength 比应有的要小得多 - 看起来文件由于某种原因没有附加到表单中。

最佳答案

我终于成功上传非拉丁名称文件。 必须以二进制形式读取并以二进制形式发送。

HTML:

<input class="js-file" name="filename" type="file">

还有js

//Handler in input
$(document).on('change', '.js-file', function(event){
            var file_name = $(this).attr('name');


            var reader = new FileReader();
            var f = event.target.files[0],
                nameArr = event.target.files[0]['name'].split('.'),
                extension = nameArr[nameArr.length-1]; //here we can check if extension is allowed

            reader.onload = function(e) {
                var contents = e.target.result;
                contents = contents.split('base64,')[1]; //we need only encoded part

                sendFileAsBinary(file_name, extension, contents);
            };

            reader.readAsDataURL(f);


        });

发件人:

function sendFileAsBinary(file_name, extension, img) {

    $.ajax({
        url: '/ajax-upload-files/',
        type: 'POST',
        data: {
            name: file_name,
            img: img,
            extension: extension
        },
        dataType: 'json',
        success: function(data){


        },
        complete: function(data) {

        }

    })

}

以及解码图像的 php 代码:

 $name = $this->_getParam('name');
 $extension = $this->_getParam('extension');
 $computedName = $name . '.' . $extension;

 $fileContent = base64_decode($this->_getParam('img'));

 file_put_contents($fileContent, $computedName);

关于javascript - 使用 jQuery 上传非拉丁名称文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519173/

相关文章:

javascript - 无法将照片从 iphone 添加到 Canvas

jquery - 在 jQuery 中获取 x、y 像素的颜色

javascript - ReactJS + JavaScript : How to parse array into a new array?

javascript - 砌体 : Images overlapping above each other

php - .htaccess 捕获所有子域并 GET 作为 GET 变量

php - SagePay 服务器集成验证签名

php - 使用 php 将破折号替换为空格

javascript - 你如何在 Javascript 中缓存图像

javascript - 随机可点击的 div 在网页中移动

javascript - jQuery:将文件类型类添加到任何文件类型的链接