【问题标题】:Upload image with an in-memory stream to input using Pillow + WebDriver?使用 Pillow + WebDriver 将带有内存流的图像上传到输入?
【发布时间】:2014-12-05 19:16:08
【问题描述】:

我使用 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

【问题讨论】:

    标签: python python-imaging-library pillow


    【解决方案1】:

    您似乎在这里问了多个问题。


    首先,如何在不将其下载到文件的情况下转换 JPEG?你已经这样做了,所以我不知道你在这里问什么。


    接下来,“并在内存中或与临时文件一样多的情况下执行此操作。”我不知道这意味着什么,但是您可以使用 stdlib 中的 tempfile 库的临时文件来执行此操作,您也可以在内存中执行此操作;两者都很简单。


    接下来,您想知道如何使用requests 进行流式上传。正如Streaming Uploads 中解释的那样,简单的方法是“简单地为你的身体提供一个类似文件的对象”。这可以是一个临时文件,但也可以很容易地成为一个BytesIO。由于您已经在问题中使用了一个,我假设您知道如何执行此操作。

    (作为旁注,我不确定为什么当请求已经为您提供了一种将响应对象用作类文件对象的方法时,您使用BytesIO(r.content),甚至通过按需流式传输而不是等到完整内容可用来做到这一点,但这与此处无关。)

    如果您想使用 selenium 而不是请求上传它……那么您确实需要一个临时文件。 selenium 的全部意义在于它正在编写 Web 浏览器的脚本。您不能只在您的网络浏览器上以上传形式输入一堆字节,您必须在文件系统上选择一个文件。所以 selenium 需要伪造你选择文件系统上的文件。这是tempfile.NamedTemporaryFile 的完美工作。


    最后,“我也想知道该流是否可以编码为 Base64”。

    当然可以。由于您只是在内存中转换图像,因此您可以使用例如base64.b64encode 对其进行编码。或者,如果您愿意,您可以将 BytesIO 包装在 codecs 包装器中,以便即时使用 base-64。但我不确定你为什么要在这里这样做。

    【讨论】:

    • 我不是在问格式转换。 Just If 可以以任何方式转换/编码该流以通过<input type='file' /> 上传图像。我必须使用 WebDriver 来完成这项任务,所以我认为我最好的选择是使用 stdlib 的临时文件。对不起,这个奇怪的问题,我对 python 很陌生,英语不是我的第一个语言(很遗憾)。无论如何,这很有帮助。我会将其标记为已回答。谢谢!
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2016-12-01
    • 2017-12-23
    • 2016-09-25
    • 2022-04-04
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多