node模拟上传文件,客户端报错
window.onload = function() {
var files = document.getElementsByTagName('input'), len = files.length, file;
for(var i = 0; i < len; i++) {
file = files[i];
if(file.type !== 'file') continue; // 不是文件类型的控件跳过
file.onchange = function() {
var _files = this.files;
if(!_files.length) return;
if(_files.length === 1){ //选择单个文件
var xhr = new XMLHttpRequest();
xhr.open('POST','http://localhost:3000/upload');
var filePath = files[0].value
xhr.setRequestHeader('file-name', filePath.substring(filePath.lastIndexOf('\\') + 1));
xhr.send(_files[0]);
} else {}
}
}
}
报错指的是value不是有效的
主要原因是 filePath.substring(filePath.lastIndexOf(’\’) + 1)这个截取出来的是‘姐姐.txt’里面含有汉字,换了一个全部是英文名称的文件就好了,那我们应该如何解决呢?
前端可以用 encodeURI() 函数可把字符串作为 URI 进行编码。
说明 参考W3School
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?😡&=+$,#
var filePath = files[0].value;
// xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.setRequestHeader('file-name', **encodeURI**(filePath.substring(filePath.lastIndexOf('\\') + 1)));
xhr.send(_files[0]);
后端 decodeURI() 对一个编码后的 URI 进行解码:
const fileName = request.headers['file-name'] ? **decodeURI**(request.headers['file-name']) : 'abc.png'
这个时候如果我们在上传带有汉字的文件名称也是可以正常显示的。