シン・アナゴのブログ

下手だけどカメラやガジェットが好きなただのおっさん。

pythonのFTPで複数の画像ファイルをアップロードする方法

Pythonのドキュメントやググって出てきた記事を参考に書いてます。 ローカルでPythonと同一ディレクトリ内のファイルをホスト側で/images/というディレクトリにアップロードする方法は以下。

クソ汚いコード

# coding: utf-8

from ftplib import FTP
ftp = FTP("xxx.xxx.xxx") #ホスト名
ftp.set_pasv("true")
ftp.login("user", "password")  #ログインIDとパス
fp = open("abcd.jpg", "rb")  #アップロードするファイル名
ftp.storbinary("STOR /images/abcd.jpg",fp) #ホスト側のディレクトリ

ftp.close()
fp.close()

注意点1

画像をアップする際は fp = open("abcd.jpg", "rb") が fp = open("abcd.jpg", "r") じゃダメ。送ることは出来るけどファイルが壊れてしまいます。

FFFTPなどではバイナリモード、テキストモードを送るファイルによって自動で振り分けてくれるけど自分でやらないといけない。ここに躓いてしまってスラダンのみっちーばりに無駄な時間を過ごしてしまったことは秘密だぞ☆

このコードだと単一ファイルしか送れないので複数ファイルにも挑戦してみました。一番最後の参考URL先にあるコードをパク…いや、大いに参考にさせていただいた。先人達に感謝です。

複数ファイルアップロードする場合

# coding: utf-8

import glob
import string
import os
from ftplib import FTP
from urllib import urlopen

filelist=glob.glob('*.jpg')
print filelist

ftp=FTP('xxx.xxx.xxx')
ftp.set_pasv("true")
ftp.login('user','password')
ftp.cwd('/images/') #ホスト側のディレクトリ

for file in filelist:
    f=open(file,'rb')
    filename=os.path.basename(file)
    cmd='STOR '+filename
    print cmd
    ftp.storbinary(cmd,f)
    f.close()
ftp.quit()

注意点2

pythonと同一フォルダ内にあるjpgファイルをアップロードしてくれます。ftp=FTP以下のコードを繰り返し書いてホスト名などを変更すれば、複数の画像ファイルを複数のサーバーにアップロードだって出来ます。仕事柄複数のファイルを複数の場所にコピーする必要がありましたので自分で書いた次第です。

参考記事

http://docs.python.jp/2/library/ftplib.html http://lightson.dip.jp/blog/seko/1341