我正在尝试使用python连接到服务器并将一些文件从我的本地目录上传到/ var / www / html,但每次我尝试这样做时都会收到此错误:
错误:ftplib.error_perm:553无法创建文件。
我已经在路径上做了一个chown和一个chmod -R 777。我正在使用vsftpd并已启用写入启用。有没有人有任何想法?
代码:
ftp = FTP('ipaddress')
ftp.login(user='user', passwd = 'user')
ftp.cwd('/var/www/html')
for root, dirs, files in os.walk(path):
for fname in files:
full_fname = os.path.join(root, fname)
ftp.storbinary('STOR' + fname, open(full_fname, 'rb'))
答案 0 :(得分:4)
我遇到类似的问题也会收到错误553: Could not create file
。什么(更新:部分)为我解决了这条线:
ftp.storbinary('STOR' + fname, open(full_fname, 'rb'))
为:
ftp.storbinary('STOR ' + '/' + fname, open(full_fname, 'rb'))
请注意,在'STOR'之后有一个 space ,我在文件名之前添加了正斜杠('/'),表示我想要存储在FTP中的文件根目录
更新 [2016-06-03] 实际上这只解决了部分问题。我后来意识到这是一个权限问题。 FTP根目录允许FTP用户写入,但我使用另一个用户在此目录中手动创建了文件夹,因此新目录不允许FTP用户写入这些目录。
可能的解决方案:
使用ftp.mkd(dir_name)
函数创建目录,然后使用ftp.cwd(dir_name)
函数更改目录,
然后使用适当的STOR函数(storlines
或storbinary
)
将文件写入当前目录。
据我所知,STOR命令似乎只将文件名作为参数(不是文件路径),这就是为什么在使用之前需要确保你在正确的“工作目录”中STOR功能(记住STOR命令后的空格)
ftp.storbinary('STOR ' + fname, open(full_fname, 'rb'))
答案 1 :(得分:0)
是path == '/var/www/html'
吗?这是一条本地路径。您需要一个FTP路径。
FTP通常无法访问本地路径/var/www/html
。当您连接到FTP服务器时,呈现给您的文件系统开始,通常是您用户的主目录/home/user
。
因为听起来你在远程机器上运行ftp服务器(vsftpd),最简单的解决方案可能是:
user@server:~$ ln -s /var/www/html /home/user/html
然后您可以调用ftp.cwd('html')
和ftp.nlst()
来获取远程目录列表,并从那里进行导航。
另外,不要忘记在'STOR'
字符串中添加空格字符(应为'STOR '
)。
祝你好运!
答案 2 :(得分:0)
我确信在这一点上你找到了一个解决方案,但我在寻找解决方案时偶然发现了这个问题。我最终使用了以下内容:
# Handles FTP transfer to server
def upload(ftp, dir, file):
# Test if directory exists. If not, create it
if dir.split('/')[-1] not in ftp.nlst('/'.join(dir.split('/')[:-1])):
print("Creating directory: " + dir)
ftp.mkd(dir)
# Check if file extension is text format
ext = path.splitext(file)[1]
if ext.lower() in (".txt", ".htm", ".html"):
ftp.storlines("STOR " + dir + '/' + file, open(dir + '/' + file, "rb"))
else:
ftp.storbinary("STOR " + dir + '/' + file, open(dir + '/' + file, "rb"), 1024)