通过伪文件上传空文件到FTP

1 投票
3 回答
1332 浏览
提问于 2025-04-16 04:06

据我所知,使用FTP是无法直接创建一个空文件的。你必须先在本地电脑上创建一个空文件,然后把它上传到服务器,最后再删除它。我在想,是否可以像这样做:

class FakeFile:
    def read(self):
        return '\x04'

ftpinstance.storbinary('stor fe', FakeFile())

我觉得这样可能有效,因为文档中提到,storbinary这个方法需要一个带有'read'方法的对象,并会一直调用这个方法,直到返回EOF(文件结束)。而\x04是ASCII码中的EOF字符。不过我试过之后,发现上传到服务器的文件大小却是随机的几千字节。我是不是理解错了什么?

3 个回答

0

其实文档上写的是“读取直到文件结束”。我通过让读取函数返回一个空字符串来解决这个问题。

4

你不需要自己去实现一个文件类,只要使用内存中的文件就可以了,这个功能在Python的内置模块StringIO(在Python 3中用BytesIO)里已经提供了。

import ftplib
import cStringIO

ftp = ftplib.FTP('ftp.example.com')
ftp.login('user', 'pass')

voidfile = cStringIO.StringIO('')
ftp.storbinary('STOR emptyfile.foo', voidfile)

ftp.close()
voidfile.close()
2

在现代使用中,文件结束符(End of File)并不是ASCII码4。这种用法已经过时了,最早是出现在XMODEM和电传打字机的时代。你可以试试这个:

class FakeFile:
    def read(self, size=0):
        return ''

因为空读取就是文件结束。

根据你现在的代码,你应该得到一个随机长度的文件,里面全是'\x04'字符。这是因为在读取时,它似乎总是有数据。^_-

撰写回答