Failed to execute setRequestHeader on XMLHttpRequest: Value is not a valid ByteString

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'

这个时候如果我们在上传带有汉字的文件名称也是可以正常显示的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值