使用jQuery上传非拉丁名称文件
Upload non-latin name file with jQuery
我有一个简单的表单,可以通过ajax将文件上传到服务器。
这里是输入事件监听器:
$(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) {}
我真的不明白出了什么问题——请求标头的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);
这是我正在使用的代码(您的代码):
HTML文件
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<script src="jquery.min.js"></script>
<script>
$(document).on('change', '#fileToUpload', function(event){
sendFile(event);
});
function sendFile (event) {
var files = event.target.files;
var myAction = 'test.php';
var myData = new FormData();
$.each(files, function(key, value){
myData.append(key, value);
});
$.ajax({
url: myAction,
type: 'POST',
data: myData,
cache: false,
// dataType: 'json',
processData: false,
contentType: false,
success: function(data){
console.log(data);
},
complete: function(data) {
}
});
}
</script>
</head>
<body>
<form action="test.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
</body>
</html>
test.php
<?php
echo var_dump($_FILES);
?>
console.log()中的结果
<pre class='xdebug-var-dump' dir='ltr'>
<b>array</b> <i>(size=1)</i>
0 <font color='#888a85'>=></font>
<b>array</b> <i>(size=5)</i>
'name' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'Максим.jpg'</font> <i>(length=16)</i>
'type' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'image/jpeg'</font> <i>(length=10)</i>
'tmp_name' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'C:'wamp'tmp'phpE01A.tmp'</font> <i>(length=23)</i>
'error' <font color='#888a85'>=></font> <small>int</small> <font color='#4e9a06'>0</font>
'size' <font color='#888a85'>=></font> <small>int</small> <font color='#4e9a06'>951214</font>
</pre>
所以,正如你所看到的,我的代码上传文件,服务器可以看到它。你的机器上有不同的结果吗?
相关文章:
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 从安卓设备将图像上传到服务器时,文件扩展名错误
- 在上传之前,我可以在代码中的哪里将文件扩展名更改为小写
- TypeScript解释了各种文件扩展名
- Firefox插件:保存到文本文件的HTTP日志,其中包含时间、用户名、计算机名;t创建文本文件
- Web浏览器扩展名通用文件
- '的文件格式和扩展名;file.xls'don't与fileSaver.js匹配
- 如何通过chrome扩展名获取所有CSS和Javascript文件
- 在javascript中检查文件扩展名的问题
- 在 iFrame 中注入 JS 文件,通过 Google chrome 扩展名中的 ContentScript 进行
- 如何使用另一个 JavaScript 文件中定义的类名调用回调函数
- 如何使用office.js检查未保存文件的具体文件扩展名
- 用于检查文件扩展名不工作的Javascript If语句
- 如何从chrome扩展名读取文件
- 忽略文件扩展名的正则表达式
- PhantomJS无法打开扩展名未知的本地文件
- Apache poi XSSF创建Excel文件-Create返回格式或文件扩展名无效的空文件
- 可以't在不提供文件扩展名的情况下导入TypeScript模块
- 根据文件扩展名应用CssClass
- 双扩展名文件的反向子字符串