Python3上传中文文件名的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3上传中文文件名的问题相关的知识,希望对你有一定的参考价值。

参考技术A 我们之前在Python2.x的时候,用requests上传文件是正常存储中文名字,但是使用Python3之后,文件名就变得不正常了。因为Java服务端接口不支持这种方式,于是只能修改Python脚本。

因为Python3使用requests的时候,会调用urllib3库—>fields.py的新处理逻辑

当文件名是中文的时候, value = email.utils.encode_rfc2231(value, 'utf-8') 就会转换格式为:
filename* 这种格式的键值对。

当然改源码文件是最快的,但是这样不利于移植。

还是修改下requests请求吧。

python请求上传文件

【中文标题】python请求上传文件【英文标题】:python requests upload file 【发布时间】:2017-10-11 19:59:52 【问题描述】:

我正在访问一个网站,我想上传一个文件。

我用python写了代码:

import requests

url = 'http://example.com'
files = 'file': open('1.jpg', 'rb')
r = requests.post(url, files=files)
print(r.content)

但是好像没有上传文件,页面和最初的一样。

我想知道如何上传文件。

该页面的源代码:

<html><head><meta charset="utf-8" /></head>

<body>
<br><br>
Upload<br><br>
<form action="upload.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="hidden" name="dir" value="/uploads/" />
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

【问题讨论】:

顺便说一句,你没有发送dirr = requests.post(url, files=files, data="dir": "/uploads/") @OzgurVatansever 我已经添加了数据。但仍然没有上传文件。 【参考方案1】:

几点:

确保将您的请求提交到正确的 url(表单“action”) 使用data参数提交其他表单字段('dir', 'submit') 在files 中包含文件名(这是可选的)

代码:

import requests

url = 'http://example.com' + '/upload.php'
data = 'dir':'/uploads/', 'submit':'Submit'
files = 'file':('1.jpg', open('1.jpg', 'rb'))
r = requests.post(url, data=data, files=files)

print(r.content)

【讨论】:

谢谢。现在可以了。看来我上传文件的网址有误。【参考方案2】:

首先,定义上传目录的路径,如,

app.config['UPLOAD_FOLDER'] = 'uploads/'

然后定义允许上传的文件扩展名,

app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

现在假设您调用函数来处理上传文件,那么您必须编写类似这样的代码,

# Route that will process the file upload
@app.route('/upload', methods=['POST'])
def upload():
    # Get the name of the uploaded file
    file = request.files['file']

    # Check if the file is one of the allowed types/extensions
    if file and allowed_file(file.filename):
        # Make the filename safe, remove unsupported chars
        filename = secure_filename(file.filename)

        # Move the file form the temporal folder to
        # the upload folder we setup
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

        # Redirect the user to the uploaded_file route, which
        # will basicaly show on the browser the uploaded file
        return redirect(url_for('YOUR REDIRECT FUNCTION NAME',filename=filename))

这样您可以上传文件并将其存储在您所在的文件夹中。

希望对你有帮助。

谢谢。

【讨论】:

感谢您的回复。实际上,我只是在访问别人拥有的网站。我可以通过浏览器上传文件,但我需要找到一种通过python上传文件的方法。

以上是关于Python3上传中文文件名的问题的主要内容,如果未能解决你的问题,请参考以下文章

Selenium4+Python3系列 - 上传文件及滚动条操作

Selenium---Python3---上传文件

python3向ftp服务器上传和下载封装(包括文件夹的上传和下载)

python3向ftp服务器上传和下载封装(包括文件夹的上传和下载)

python3向ftp服务器上传和下载封装(包括文件夹的上传和下载)

使用 Flask 和 Python 3 测试文件上传