在不下载 Python 中的文件的情况下检查存储在 FTP 服务器上的图像的纵横比
Check aspect ratio of image stored on an FTP server without downloading the file in Python
我在 FTP 上有图片,我想在从 FTP 服务器下载图片之前检查图片的纵横比。使用 Python ftplib
,是否可以在不下载文件的情况下检查 FTP 上的图像尺寸(即宽度和高度)?
图像尺寸是文件内容的一部分。因此,您至少需要 下载 包含该信息的文件部分。这将与图像文件格式不同。但通常它会在文件的最开头。
如何使用 ftplib 实现:只要开始下载并在收到足够的数据后中止它。在 FTP 中没有更聪明的方法来实现这一点。有关示例,请参阅 。
我会尝试阅读 8KB 之类的内容,应该绰绰有余。然后您可以使用这样的代码从部分文件中检索大小:Get Image size WITHOUT loading image into memory
from PIL import Image
from ftplib import FTP
from io import BytesIO
ftp = FTP()
ftp.connect(host, user, passwd)
cmd = "RETR {}".format(filename)
f = BytesIO()
size = 8192
aborted = False
def gotdata(data):
f.write(data)
while (not aborted) and (f.tell() >= size):
ftp.abort()
aborted = True
try:
ftp.retrbinary(cmd, gotdata)
except:
# An exception when transfer is aborted is expected
if not aborted:
raise
f.seek(0)
im = Image.open(f)
print(im.size)
相关问题:Reading image EXIF data from SFTP server without downloading the file
我在 FTP 上有图片,我想在从 FTP 服务器下载图片之前检查图片的纵横比。使用 Python ftplib
,是否可以在不下载文件的情况下检查 FTP 上的图像尺寸(即宽度和高度)?
图像尺寸是文件内容的一部分。因此,您至少需要 下载 包含该信息的文件部分。这将与图像文件格式不同。但通常它会在文件的最开头。
如何使用 ftplib 实现:只要开始下载并在收到足够的数据后中止它。在 FTP 中没有更聪明的方法来实现这一点。有关示例,请参阅
我会尝试阅读 8KB 之类的内容,应该绰绰有余。然后您可以使用这样的代码从部分文件中检索大小:Get Image size WITHOUT loading image into memory
from PIL import Image
from ftplib import FTP
from io import BytesIO
ftp = FTP()
ftp.connect(host, user, passwd)
cmd = "RETR {}".format(filename)
f = BytesIO()
size = 8192
aborted = False
def gotdata(data):
f.write(data)
while (not aborted) and (f.tell() >= size):
ftp.abort()
aborted = True
try:
ftp.retrbinary(cmd, gotdata)
except:
# An exception when transfer is aborted is expected
if not aborted:
raise
f.seek(0)
im = Image.open(f)
print(im.size)
相关问题:Reading image EXIF data from SFTP server without downloading the file