FTP下载 550 Failed to open file

2023-05-16

工作需要自己搭建了一台ftp服务器,用作测试。
以下为ftp工具类:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class FtpUtil {

    /**
     * 连接ftp
     * @param url
     * @param username
     * @param password
     * @return
     * @throws IOException
     */
    public static FTPClient ftpConnection(String url, String username, String password) throws IOException {
        FTPClient ftpClient = new FTPClient();
        String[] split = url.split(":");
        if (split.length != 2){
             System.out.println("--Connection error-->" + "ftp url is error");
        }
        String ip = split[0];
        String port = split[1];
        try {
            ftpClient.connect(ip, Integer.parseInt(port));
            if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)){
                ftpClient.login(username, password);
            }
            int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
            if(!FTPReply.isPositiveCompletion(replyCode)) { //连接失败
                String replyString = ftpClient.getReplyString();
                System.out.println(replyString);
                ftpClient.disconnect();
                System.exit(1);
            }
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.changeWorkingDirectory("/var/ftp/local");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ftpClient;
    }

    /**
     * 断开FTP服务器连接
     * @param ftpClient  初始化的对象
     * @throws IOException
     */
    public static void close(FTPClient ftpClient) throws IOException{
        if(ftpClient != null && ftpClient.isConnected()){
            ftpClient.logout();
            ftpClient.disconnect();
        }
    }

    //上传
    public static void upload(FTPClient ftpClient, File f) throws IOException {
        if (f.isDirectory()){
            ftpClient.makeDirectory(f.getName());
            ftpClient.changeWorkingDirectory(f.getName());
            String[] files = f.list();
            for(String fstr : files){
                File file1 = new File(f.getPath()+"/"+fstr);
                if (file1.isDirectory()){
                    upload(ftpClient, file1);
                    ftpClient.changeToParentDirectory();
                }else {
                    FileInputStream input = new FileInputStream(file1);
                    ftpClient.storeFile(file1.getName(), input);
                    input.close();
                }
            }
        }else {
            ftpClient.changeWorkingDirectory("/var/ftp/local");
            FileInputStream input = new FileInputStream(f);
            boolean b = ftpClient.storeFile(f.getName(), input);
            input.close();
        }

    }

    /**
     * 删除ftp文件
     * @param ftpClient {@link FTPClient}
     * @param workingDirectory 当前文件所在工作目录,若已在当前工作目录下则不需传入(null即可)
     * @param fileName 文件名称
     * @return 删除成功则为true,否则为false
     */
    public static boolean deleteFile(FTPClient ftpClient, String workingDirectory, String fileName){
        try {
            if (StringUtils.isNotBlank(workingDirectory)){
                ftpClient.changeWorkingDirectory(workingDirectory);
            }
            return ftpClient.deleteFile(fileName);
        }catch (Exception e){
            InetAddress remoteAddress = ftpClient.getRemoteAddress();
            System.out.println(remoteAddress.getHostAddress());
            e.printStackTrace();
        }
        return false;
    }

    public static void main(String[] args) {
        try {
            FTPClient ftpClient = ftpConnection("192.168.199.128:21", "ftpuser", "ftpuser");
            downFile(ftpClient, "CH05_20220214115818.xml", "E:\\FTP-TEST");
            //upload(ftpClient, new File("E:\\FTP-TEST/CH06_20220214115439.xml"));
            //deleteFile(ftpClient, "/var/ftp", "readme.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载ftp服务器文件方法
     * @param ftpClient FTPClient对象
     * @param fileAbsPath 原文件(路径+文件名)
     * @param localUrl  本地文件存储路径
     * @throws IOException
     */
    public static String downFile(FTPClient ftpClient, String fileAbsPath, String localUrl) throws IOException {
        OutputStream os = null;
        System.out.println(fileAbsPath.lastIndexOf("/"));
        String fileName = fileAbsPath.substring(fileAbsPath.lastIndexOf("/")+1);
        File localFile = new File(localUrl + "/" + fileName);
        if (!localFile.getParentFile().exists()){//文件夹目录不存在创建目录
            localFile.getParentFile().mkdirs();
            localFile.createNewFile();
        }
        os = new FileOutputStream(localFile);
        boolean isTrue = ftpClient.retrieveFile(new String(fileAbsPath.getBytes(), StandardCharsets.UTF_8), os);
        if (!isTrue){
            System.out.println("--error-->" + ftpClient.getReplyString());
        }
        os.close();
        return localFile.getAbsolutePath();
    }
}

使用该工具类上传的文件,再根据此工具类的下载方法下载是没问题的;
若将需要下载的文件直接使用服务器上传(rz)后,这时再使用该工具类下载会报错:

550 Filed to open file

之后排查原来是该文件的权限问题,使用该工具类上传时该文件的权限与通过服务器直接上传的权限不同,若通过服务器直接上传后更改该文件的权限:

[root@localhost local]# chmod 777 CH05_20220214115818.xml 

之后再使用该工具类下载则没有问题,归根结底还是文件权限的问题, 特此记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FTP下载 550 Failed to open file 的相关文章

  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • Python FTP下载550错误

    我编写了一个 ftp 爬虫来下载特定文件 它会一直工作 直到找到要下载的特定文件 然后抛出此错误 ftplib error perm 550 该文件存在于我的下载文件夹中 但文件大小为 0 kb 我需要转换某些内容才能下载吗 我可以访问 f
  • php同时上传最大文件数

    我正在使用标签 用于使用 php 上传多个文件 我注意到 如果我选择超过 20 个文件 php 只会上传前 20 个文件 有没有办法扩大这个限制 这个限制被添加到PHP 5 2 12 https www php net releases 5
  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • 无法从本地文件夹运行 Jquery

    你好 我是网络开发新手 我需要与JQuery 即使我已经成功尝试过一个jquery但仅在将文件复制到我的在线 ftp 文件夹后 我完全无法从本地文件夹运行它 请解释一下 如何我可以测试一些新脚本吗 进行额外的练习将文件复制到 ftp 文件夹
  • 使用python删除未访问的文件

    My django app解析用户上传的一些文件 用户上传的文件可能会在服务器中保留很长时间 而没有被应用程序解析 如果很多用户上传大量文件 这可能会增加大小文件 我需要删除应用程序最近未解析的那些文件 比如not accessed for
  • 从 tsv 文件 python 中提取数据

    我有一个 TSV 文件 如下所示 A B C D D 1 E 2 S D F G H 2 B 4 我想以这种方式将内容写入另一个 tsv 文件 A B C D D 1 A B C D E 2 S D F G H 2 S D F G B 4
  • iPhone - 从网络服务器获取文件的上次修改日期

    我想检查网络服务器上文件的上次修改日期 任何帮助都会很棒 谢谢 NSURLRequest request NSURLRequest alloc initWithURL aURL NSHTTPURLResponse response NSUR
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 在 Android 中哪里可以找到应用程序数据

    我的目标是将应用程序中的数据保存在文本文件中以供进一步分析 我使用了给出的确切代码here http www mysamplecode com 2012 06 android internal external storage html用于
  • 在 python 错误中,translate() 只接受一个参数(给定 2 个参数)

    import os import re def rename files get the files from dir file list os listdir r C OOP prank print file list saved pat
  • 从多个进程附加到单个文件的“线程安全”?

    假设我有 X 个进程打开文件 Y 进行追加 每个进程一次只写入一行 带有 n 真正的日志条目 文件 Y 中的每一行是否保证不会错误地交错 更新 本地附加文件系统 问题取决于正在进行什么类型的写入 如果您使用带缓冲的标准 I O 这通常是大多
  • Java-使用InputStream作为文件

    我正在尝试使用上传的 docx 文件生成 PDF 文档JOD转换器 http www artofsolving com opensource jodconverter 对生成 PDF 的方法的调用如下所示 File inputFile ne
  • getExternalCacheDir() 在 Android 上如何工作?

    据我了解 我们将经常访问的对象缓存在比普通磁盘读取更容易访问的内存段中 getExternalCacheDir 相对于getCacheDir 指向外部文件系统 在我看来这是正常的getExternalFilesDir Android 如何优
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • Java IO 文件前缀字符串太短 - 但事实并非如此

    尝试从一个目录创建简单的 tar gz 文件 有我的代码 File destinationFile new File var www swOfflineFeeds Companies 2 File sourceFile new File v
  • 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要从 txt 文件中读取日期并将其放入 GUI 中的 JTable 中 然后修改一些记录或删除一些行并将新数据保存到文件中 我可以
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 同步写入使用 FILE_FLAG_OVERLAPPED 打开的文件

    我已经使用打开了一个文件 HANDLE handle CreateFileW fileName GENERIC READ GENERIC WRITE 0 NULL OPEN EXISTING FILE FLAG OVERLAPPED NUL
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files

随机推荐