问答

java ftp上传时,代码不报错,也上传不过去文件

作者:admin 2021-04-20 我要评论

今天测试上传文件到 ftp 服务器时,上传不过去。其中遇到了假死问题,已经解决了。 解决以后,就发现在这行代码,一直返回 false 。 flag = ftpClient.storeFile...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

今天测试上传文件到 ftp 服务器时,上传不过去。其中遇到了假死问题,已经解决了。
解决以后,就发现在这行代码,一直返回 false 。

flag = ftpClient.storeFile(new String(remote.getBytes("UTF-8"),"iso-8859-1"), is);

我查了百度后,各种方法都试过了,都不行,例如:
1.开启这三个
image.png
2.设置

//调用此方法解决假死状态(设置为被动模式:客户端通知服务端开通一个端口用来数据传输)
ftpClient.enterLocalPassiveMode();

3.设置字符集

new String(remote.getBytes("UTF-8"),"iso-8859-1")

4.查看路径权限
image.png

都试过了,都不行!!!!已经无语了,百度了好久都是这几种解决办法。难受,有没有大佬帮忙看看!!!!代码如下:

public class FTPUtil {
    /**
 * 文件上传
 *
 * @param host 服务器IP
 * @param port 服务器端口
 * @param username 服务器用户名
 * @param password 服务器密码
 * @param path /home/ftpuser/test/年/月/日
 * @param fileName 文件名1.jpg
 * @param is 文件流
 * @return
 */
 public static String fileUpload(String host, int port, String username, String password,
 String path, String fileName, InputStream is) {
        // 判断操作是否正确
 boolean flag = false;
 // 返回的文件名
 String remote = null;
 // 创建ftp客户端
 FTPClient ftpClient = new FTPClient();
 try {
            // 设置编码字符集
 ftpClient.setControlEncoding("UTF-8");
 // 连接FTP服务器
 ftpClient.connect(host, port);
 // 登录
 flag = ftpClient.login(username, password);
 //调用此方法解决假死状态(设置为被动模式:客户端通知服务端开通一个端口用来数据传输)
 ftpClient.enterLocalPassiveMode();
 if (!flag) {
                System.out.println("文件服务器用户名或密码错误");
 return null; }
            // 获取登录的状态码
 int reply = ftpClient.getReplyCode();
 if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
 return null; }
            /*****************创建目录 一次只能创建一个目录*****************/
 String basePath = "";
 for (String p : path.split("/")) {
                basePath += (p + "/");
 // 判断目录是否已经存在
 boolean hasPath = ftpClient.changeWorkingDirectory(basePath);
 if (!hasPath) {
                    // 创建目录 一次只能创建一个目录,失败的原因都是权限问题
 //ftpClient.makeDirectory(basePath);
 ftpClient.makeDirectory(new String(basePath.getBytes("UTF-8"),"iso-8859-1"));
 }
            }
            // 重新指定上传的路径
 ftpClient.changeWorkingDirectory(path);
 /*******************************************************/
 // 指定上传方式为二进制方式
 ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 // 得到文件后缀
 String suffix = fileName.substring(fileName.lastIndexOf("."));
 System.out.println("文件后缀为:" + suffix);
 remote = UUID.randomUUID() + suffix;
 // remote指定上传远程服务器的文件名 local指本地的输入流
 //flag = ftpClient.storeFile(remote, is);
 flag = ftpClient.storeFile(new String(remote.getBytes("UTF-8"),"iso-8859-1"), is);
 System.out.println(flag);
 if (!flag) {
                System.out.println("文件上传失败,可能是权限,防火墙等问题");
 return null; }
        } catch (IOException e) {
            System.out.println("文件上传错误,错误原因:" + e.getMessage());
 } finally {
            try {
                if(is != null)
                    is.close();
 ftpClient.logout();
 if(ftpClient.isConnected())
                    ftpClient.disconnect();
 } catch (IOException e) {
                System.out.println("文件上传错误,错误原因:" + e.getMessage());
 }
        }
        return remote;
 }
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream is = new FileInputStream(new File("D://123.txt"));
 fileUpload("182.92.xxx.xxx", 21, "ftpuser", "xxx",
 "/home/ftpuser/", "123.txt", is);
 }
}

返回结果

image.png

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器