使用 pycurl 从西里尔路径上传文件
我最近设计了一个由 PyCURL 支持的上传对话框,我正在我的一些应用程序中使用它。
我在设置 pycurl 的 HTTPPOST 选项时遇到了问题。我这样设置:
self.curl.setopt(self.curl.HTTPPOST, [(字段, (self.curl.FORM_FILE, 文件名))])
如果文件名是字符串,则一切正常。然而,如果我向它传递一个 unicode,它会引发一个 TypeError。 我有什么办法可以给它一个西里尔路径吗?我尝试过UTF-8编码,但不成功。 感谢您抽出时间
更新:
我实际上是从 WX 控件获取文件名,因此在我接触它之前它就是 unicode。然后,当我将其编码为 UTF-8 时(使用 filename = filename.encode('UTF-8')),setopt 运行正常,但执行时一切都会崩溃:
* About to connect() to example.com port 80 (#0)
* Trying 123.123.123.123... * connected
* Connected to example.com (123.123.123.123) port 80 (#0)
* failed creating formpost data
* Connection #0 to host example.com left intact
Traceback (most recent call last):
File "c:\python27\lib\site-packages\transfer_dialogs-0.28-py2.7.egg\transfer_dialogs\transfer_dialogs.py", line 64, in perform_transfer
self.curl.perform()
error: (26, 'failed creating formpost data')
更新 2:
根据要求,多一点数据。文件名包含打开对话框中 GetValue() 的结果。
logging.debug("文件名: %r 编码文件名: %r" % (文件名, filename.encode('UTF-8')))
结果:
2011 年 2 月 5 日星期六 03:33:56 core.dialogs.upload_audio 调试:文件名:u'C:\Users\Q\test\\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u0430 \u043f\u043a\u0430\test.mp3' 编码文件名:'C:\Users\Q\test\\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0 \xb0\xd1\x8f\xd0\xbf\xd0\xb0\xd0\xbf\xd0\xba\xd0\xb0\test.mp3'
I've recently designed an upload dialog backed by PyCURL which I'm using in a few of my applications.
I have run into an issue when setting pycurl's HTTPPOST option. I am setting it like so:
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, filename))])
If filename is a string, all is fine. If I pass it a unicode, however, it raises a TypeError.
Is there any way for me to be able to give it a Cyrillic path? I tried UTF-8 encoding it, but that was unsuccessful.
Thank you for your time
Update:
I'm actually getting the filename from a WX control, so it's unicode before I even touch it. When I then encode it to UTF-8, (using filename = filename.encode('UTF-8')) the setopt goes fine but everything blows up on perform:
* About to connect() to example.com port 80 (#0)
* Trying 123.123.123.123... * connected
* Connected to example.com (123.123.123.123) port 80 (#0)
* failed creating formpost data
* Connection #0 to host example.com left intact
Traceback (most recent call last):
File "c:\python27\lib\site-packages\transfer_dialogs-0.28-py2.7.egg\transfer_dialogs\transfer_dialogs.py", line 64, in perform_transfer
self.curl.perform()
error: (26, 'failed creating formpost data')
Update 2:
As requested, a bit more data. filename contains the result of a GetValue() from the open dialog.
logging.debug("Filename: %r encoded filename: %r" % (filename, filename.encode('UTF-8')))
result:
Sat Feb 05, 2011 03:33:56 core.dialogs.upload_audio DEBUG: Filename: u'C:\Users\Q\test\\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430\test.mp3' encoded filename: 'C:\Users\Q\test\\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbf\xd0\xba\xd0\xb0\test.mp3'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
文件名应采用 UTF-8 格式,且您上传文件的主机应支持 UTF-8 文件名。如果它支持不同的非 Unicode 编码,请尝试对文件名 KOI8-R 或 WIN1251 进行编码(但这当然不太好且不符合标准)。
编辑,看到评论后:可能应该是
ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")< /代码>。
你
认为这很重要;如果没有它,西里尔字母将在您的控制台编码中进行编码。我只是尝试了一下,它成功了(不是上传,只是setopt
)。Filename should be in UTF-8, and the host you upload it to should support UTF-8 file names. If it supports a different, non-Unicode encoding, try to encode the filename KOI8-R or WIN1251 (but this, of course, is not nice and standards-compliant).
EDIT, having seen the comments: Probably it should have been
ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")
. Thatu
bit it important; without it, the Cyrillic letters are taken encoded in your console encoding. I did just try it, and it worked (not upload, justsetopt
).将此问题分解为 2 个部分:
这些可能是相同的编码,也可能不是相同的编码。
对于 1,使用 sys.getfilesystemencoding() 来将 unicode 文件名(在整个 Python 代码中正确使用)转换为 pycurl/libcurl 可以使用 fopen() 正确打开的字符串。使用
strace
(linux) 或等效的 windows osx 验证 pycurl 打开的文件路径是否正确。如果完全失败,您始终可以通过 pycurl.READFUNCTION 从 Python 提供文件数据流。
对于2,了解文件上传过程中如何传输文件名,示例。我没有一个好的链接,我只知道这不是微不足道的,例如当涉及到很长的文件名时。
Decompose this problem into 2 components:
These may or may not be same encodings.
For 1, use
sys.getfilesystemencoding()
to convert unicode filename (which you use throughout python code correctly) to a string that pycurl/libcurl can open correctly withfopen()
. Usestrace
(linux) or equivalent windows osx to verify correct file path is being opened by pycurl.If that totally fails you can always feed file data stream from Python via
pycurl.READFUNCTION
.For 2, learn how filename is transmitted during file upload, example. I don't have a good link, all I know it's not trivial, e.g. when it comes to very long file names.