هل يمكنني تحميل كائن في الذاكرة إلى 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/النص مع FTP.storlines:

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

للحصول على أمثلة أكثر تقدمًا ، انظر:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top