我使用Pillow从URL获取图像,并创建一个流(BytesIO / StringIO)。
r = requests.get("http://i.imgur.com/SH9lKxu.jpg")
stream = Image.open(BytesIO(r.content))
因为我想使用带有selenium WebDriver的<input type="file" />
上传此图片。我可以做这样的事情来上传文件:
self.driver.find_element_by_xpath("//input[@type='file']").send_keys("PATH_TO_IMAGE")
我想知道如果可以从流中上传该图像而不必弄乱文件/文件路径......我试图避免文件系统读/写。并在内存中或临时文件中执行此操作。我还想知道如果该流可以编码为Base64,然后上传将字符串传递给send_keys函数,您可以在上面看到:$
PS:希望你喜欢这个形象:P
答案 0 :(得分:1)
您似乎在这里提出了多个问题。
首先,如何转换JPEG而不将其下载到文件中?你已经这样做了,所以我不知道你在这里问的是什么。
接下来,“在内存中或在临时文件中执行此操作。”我不知道这意味着什么,但是您可以使用stdlib中tempfile
库的临时文件来执行此操作,您也可以在内存中执行此操作;两者都很容易。
接下来,您想了解如何使用requests
进行流式上传。如Streaming Uploads中所述,这样做的简单方法是“简单地为您的身体提供类似文件的对象”。这可以是一个临时文件,但它可以很容易地成为BytesIO
。由于您已经在问题中使用了一个,我假设您知道如何执行此操作。
(作为旁注,当请求已经为您提供将响应对象用作类文件对象的方法时,我不确定为什么您正在使用BytesIO(r.content)
,甚至通过按需流式传输来实现,而不是等到完整内容可用,但这与此无关。)
如果你想用selenium而不是请求上传它......那么你做需要一个临时文件。硒的全部意义在于它正在编写Web浏览器的脚本。您不能只在上传表单中在Web浏览器中键入一堆字节,您必须在文件系统上选择一个文件。所以selenium需要假装你在文件系统上选择一个文件。这是tempfile.NamedTemporaryFile
的完美工作。
最后,“我也想知道如果该流可以编码为Base64”。
当然可以。由于您只是在内存中转换图像,因此您可以使用例如base64.b64encode
对其进行编码。或者,如果您愿意,可以将BytesIO
包裹在codecs
封装器中,以便在运行时将其封装到64位。但我不确定你为什么要这样做。