我有简单的表单来将文件上传到服务器。
这是输入事件监听器:
$(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/