<p>注意,我在SO上找到了一些<a href="https://stackoverflow.com/questions/1293518/proxies-in-python-ftp-application">similar</a><a href="https://stackoverflow.com/questions/11768214/python-download-a-file-over-an-ftp-server">questions</a>,但是由于OP要求提供详细的初学者级别的答案,我决定发布这个。在</p>
<p>为了澄清,以下是我对您想要实现的目标的理解:</p>
<ul>
<li>代理服务器后面有一个FTP服务器。在</li>
<li>FTP服务器需要用户/密码凭据,但代理本身不需要。在</li>
</ul>
<p>一种选择是使用<code>ftplib</code>包。流行语言(如Python)的一大优点是可以选择范围广泛的包,这些包提供了特定功能的良好实现。在这种情况下,ftp客户端:</p>
<pre><code>import ftplib # 1
ftp = ftplib.FTP("officeproxy.com:8080") # 2
ftp.set_debuglevel(1) # 3
ftp.login("papa", "tango123") # 4
filename = "hello.txt"
f = open(filename, 'wb') # 5
ftp.retrbinary("RETR " + filename , f.write) # 6
f.close() # cleanup file handle
ftp.quit() # cleanup ftp client
</code></pre>
<p>代码的作用如下:</p>
<ol>
<li>导入<code>ftplib</code>包。在</li>
<li>通过代理连接到FTP服务器。我编写它的方式是假设代理设置为在指定的端口(在您的示例中是8080)上转发FTP协议。<em>如果不是这样的话,这是行不通的。</em></li>
<li>启用调试日志记录。从<a href="https://docs.python.org/2/library/ftplib.html#ftplib.FTP.set_debuglevel" rel="nofollow noreferrer">the ftplib documentation</a>:</li>
</ol>
<blockquote>
<p><code>FTP.set_debuglevel(level)</code>: <code>0</code>, produces no debugging output... <code>1</code> produces a moderate amount of debugging output... <code>2</code> or higher produces the maximum amount of debugging output</p>
</blockquote>
<ol start=“4”>
<li>使用user=“papa”,passwd=“tango123”登录到FTP服务器。同样,这是来自<a href="https://docs.python.org/2/library/ftplib.html#ftplib.FTP.login" rel="nofollow noreferrer">ftplib documentation for login()</a></li>
<li><a href="https://docs.python.org/2/library/functions.html#open" rel="nofollow noreferrer">Open a local file</a>用于写入要从FTP服务器检索的文件的内容。第一个参数是要保存到的文件的文件名(可以是任何文件,我决定使用与FTP服务器上的文件名相同的文件名)。第二个参数是您希望打开文件的<em>模式</em>,它是一个标志字符串:w='write mode',b='binary mode',因为我们将以二进制形式检索文件并将其作为二进制文件写入。在</li>
<li>我建议你阅读<a href="https://docs.python.org/2/library/ftplib.html#ftplib.FTP.retrbinary" rel="nofollow noreferrer">ftplib documentation for retrbinary</a>。一开始这有点难理解。第一个参数,<code>"RETR" + filename</code>是发送到FTP服务器的命令,在本例中是<code>RETR hello.txt</code>。第二个参数,<code>f.write</code>是您希望<code>ftp.retrbinary</code>函数在有来自服务器的数据块时调用的<em>回调</em>函数。在它的实现中,只要<code>retrbinary</code>有数据,它就会调用<code>f.write(data)</code>,其中{<cd9>}是它拥有的最新数据块。要了解Python中回调的工作原理,请参见<a href="https://www.import.io/post/introduction-to-asynchronous-apis-in-python/" rel="nofollow noreferrer">Introduction to Asynchronous APIs in Python</a></li>
</ol>
<p>我希望这对你有用,我希望答案足够详细,让你明白它是如何工作的。如果它不起作用,请为您得到的错误发布堆栈跟踪输出。在</p>