问题描述
flask从前端传参后,后台脚本拿到的却是16进制的字符,从而导致不认识文件名,报错。
问题出现的环境背景及自己尝试过哪些方法
1、对传参后进行重新编码和解码,但是得到的确实更奇怪的编码。
2、这是uwsgi的报错日志。可以看到编码成了16进制。
There is a exception: [Errno 2] No such file or directory: b'upload/xe3x80x8axe9x87x8dxe7x94x9fxe4xb9x8bxe8xa1x99xe5x86x85xe3x80x8bxefxbcx88xe7xb2xbexe6xa0xa1xe5x85xb8xe8x97x8fxe5x85xa8xe6x9cxacxefxbcx89xe4xbdx9cxe8x80x85xefxbcx9axe4xb8x8dxe4xbfxa1xe5xa4xa9xe4xb8x8axe6x8ex89xe9xa6x85xe9xa5xbc.txt'
[pid: 16262|app: 0|req: 8/17] 119.123.73.233 () {44 vars in 1180 bytes} [Fri Apr 26 21:57:23 2019] GET /mail/%E3%80%8A%E9%87%8D%E7%94%9F%E4%B9%8B%E8%A1%99%E5%86%85%E3%80%8B%EF%BC%88%E7%B2%BE%E6%A0%A1%E5%85%B8%E8%97%8F%E5%85%A8%E6%9C%AC%EF%BC%89%E4%BD%9C%E8%80%85%EF%BC%9A%E4%B8%8D%E4%BF%A1%E5%A4%A9%E4%B8%8A%E6%8E%89%E9%A6%85%E9%A5%BC.txt => generated 27 bytes in 6 msecs (HTTP/1.1 200) 4 headers in 242 bytes (1 switches on core 1)
将传参后的参数重新编解码后,出现了更奇怪的错误,如下:
There is a exception: [Errno 2] No such file or directory: b'upload/\u300a\u91cd\u751f\u4e4b\u8859\u5185\u300b\uff08\u7cbe\u6821\u5178\u85cf\u5168\u672c\uff09\u4f5c\u8005\uff1a\u4e0d\u4fe1\u5929\u4e0a\u6389\u9985\u997c.txt'
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
相关代码如下:
1、html上传参的代码片段,head默认宣告utf-8编码
<button type="button" class="btn btn-default btn-sm"> 发送到我的kindle </button>
2、flask上的代码片段:
@app.route('/mail/<filename>')
@login_required
def mail(filename):
kindle_mail = flask.g.user.kindle_mail
smtp_attachment(filename,kindle_mail)
return '已发送 %s' %kindle_mail
3、脚本smtp_attachment的代码片段:
def smtp_attachment(filename,kindlemail):
filepath = 'upload'
try:
msg = MIMEMultipart()
msg['From'] = from_address
msg['To'] = to_address
msg['Subject'] = 'Convert'
#filename_new = filename.encode('raw_unicode_escape').decode() #这里尝试将16进制重新编解码,在终端上显示OK,但是在uwsgi里运行,报错更奇怪。
file = os.path.join(filepath,filename)
# 邮件附件
content = open(file.encode('utf-8'), 'rb').read()
你期待的结果是什么?实际看到的错误信息又是什么?
期望大神帮忙看下,如果能优雅的把中文传过去?
已经解决。
原因是之前是用python直接起的,所以用的启动环境的当前目录,后面换成了uwsgi,而代码里是用的相对路径,所以就出错了。