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 的相关文章

  • 读取一个文本文件,替换其中的单词,输出到另一个文本文件

    所以我试图在 GO 中编写一个程序来获取一个充满代码的文本文件并将其转换为 GO 代码 然后将该文件保存到 GO 文件或文本文件中 我一直在试图弄清楚如何保存对文本文件所做的更改 但我可以看到更改的唯一方法是通过 println 语句 因为
  • PHP 一次只能看到 20 个上传文件

    当我尝试一次上传超过 20 个文件时 网络服务器只能看到前 20 个文件 任何其他文件都会被忽略 问题是什么 简单的代码可以尝试
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • 使用文件名将文件一个文件夹复制到 Google 云端硬盘中的另一个文件夹

    我的谷歌云端硬盘帐户中有两个文件夹 文件夹 1 和 文件夹 2 文件夹1 内有多个文件 假设有一个文件名Test txt我想复制Test txt使用 Driveapp 将文件保存到 文件夹 2 我找到了代码 但它仅适用于 文件唯一 ID 我
  • 如何递归列出远程 FTP 的目录内容

    从远程 UNIX FTP 服务器下载文件后 您想要验证是否已正确下载所有文件 您至少会在 Windows 命令提示符中获得类似于 dir s 命令的信息 FTP 客户端在 Windows 上运行 遗憾的是这是为 Unix Linux 用户编
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到
  • 如何读取 C# 字符串字典并将其写入文件?

    我有一个 Dictionary 对象 我想写入磁盘并能够从磁盘读取它 理想情况下 我会避免使用任何第三方库 有没有一种简单的方法可以使用常规 C 4 来做到这一点 答案已接受 Summary 选项 1 使用 JavaScriptSerial
  • Magento Connect Manager 和 ftp 写入文件权限

    将我的网站从开发域转移到实时域后 我尝试使用 magento 连接管理器安装扩展 但是我不断收到 CONNECT ERROR Please check for sufficient ftp write file permissions Yo
  • 单击一次文件丢失

    将 Clickonce 与 VS 2010 和 NET Framework Client profile 3 5 一起使用 我有几个文件夹 其中包含运行时所需的应用程序级 XML 和 或文本文件 这些文件夹位于要使用它们的同一项目中 这些文
  • fputc() 之后 c fgetc() 中的文件处理问题

    我有一个带有文件名的文本文件in txt 其中包含以下内容 1111 1100 0000 我正在尝试使用以下程序更改此文件的内容 include
  • PHP上传问题

    我使用了一些脚本来开始在我的开发计算机上上传文件 问题是 尽管此操作预期很容易 但每当我尝试上传图像时 Apache 似乎都会超时 上传设置为On和tmp目录设置在php ini 我尝试上传主要内容gif来自谷歌 一个8 36KB图像 它应
  • PHP + FTP删除文件夹中的文件

    我刚刚编写了一个 PHP 脚本 它应该连接到 FTP 并删除特殊文件夹中的所有文件 它看起来像这样 但我不知道需要什么命令来删除文件夹日志中的所有文件 任何想法
  • 从通知中打开文件

    我从服务器下载一个文件 对于此操作 我显示了进度不确定的通知 下载文件后 我想通过单击通知来打开它 我获得了扩展名并尝试使用以下命令打开它intent像这样 public static Intent openFile Context con
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • 如何根据扩展名获取文件类型信息? (不是 MIME)在 c# 中

    如何获取基于扩展名的一般文件类型描述 如资源管理器 所以不是 MIME 而是最终用户看到的信息 doc Microsoft Office Word 97 2003 文档 zip ZIP 文件 avi 视频文件 我怎样才能获得似乎可用的 辅助
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐