Могу ли я загрузить объект в память на FTP, используя Python?

StackOverflow https://stackoverflow.com/questions/2671118

Вопрос

Вот что я делаю сейчас:

mysock = urllib.urlopen('http://localhost/image.jpg')
fileToSave = mysock.read()
oFile = open(r"C:\image.jpg",'wb')
oFile.write(fileToSave)
oFile.close
f=file('image.jpg','rb')
ftp.storbinary('STOR '+os.path.basename('image.jpg'),f)
os.remove('image.jpg')

Написание файлов на диск, а затем имусюсменным удалением их кажется дополнительной работой в системе, которую следует избегать. Могу ли я загрузить объект в память на FTP, используя Python?

Это было полезно?

Решение

Потому что набрав утки, файл объект (f в вашем коде) необходимо только поддержать .read(blocksize) позвонить на работу с storbinary. Отказ Когда столкнулся с такими вопросами, я иду к источнику, в этом случае lib / python2.6 / ftplib.py:

def storbinary(self, cmd, fp, blocksize=8192, callback=None):
    """Store a file in binary mode.  A new port is created for you.

    Args:
      cmd: A STOR command.
      fp: A file-like object with a read(num_bytes) method.
      blocksize: The maximum data size to read from fp and send over
                 the connection at once.  [default: 8192]
      callback: An optional single parameter callable that is called on
                on each block of data after it is sent.  [default: None]

    Returns:
      The response code.
    """
    self.voidcmd('TYPE I')
    conn = self.transfercmd(cmd)
    while 1:
        buf = fp.read(blocksize)
        if not buf: break
        conn.sendall(buf)
        if callback: callback(buf)
    conn.close()
    return self.voidresp()

Как прокомментировал, это только хочет подобный файл объект, действительно, это даже не будет особенно подобным, это просто нужно read(n). Stringio Обеспечивает такие услуги «файл памяти».

Другие советы

import urllib
import ftplib

ftp = ftplib.FTP(...)
f = urllib.urlopen('http://localhost/image.jpg')
ftp.storbinary('STOR image.jpg', f)

Вы можете использовать любую память подобный файл объект, подобно BytesIO:

from io import BytesIO

Работает как в двоичном режиме с FTP.storbinary:

f = BytesIO(b"the contents")
ftp.storbinary("STOR /path/file.txt", f)

а также в режиме ASCII / Text с FTP.storlines:

f = BytesIO(b"the contents")
ftp.storlines("STOR /path/file.txt", f)

Для более продвинутых примеров см.:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top