java上传文件通过ftp到服务器后,内容为空或者0kb

ftp上传的问题:

记录下java前端上传file文件后,后端接收后再通过ftp上传到服务器上。

前端使用的vue,element,前端实现没啥问题,主要问题在于后端上传文件到ftp服务器上时,文件内容为空或者0kb。主要关键点就在于下面这行代码:

//ftp端口的打开和关闭
ftpClient.enterLocalPassiveMode();

这行代码一定要在ftpClient.login(username, password);前面,这样才能生效

完整ftp工具类代码如下:

package com.jsc.transplant.utils;



import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;



import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;



public class FavFTPUtil {

    /**

     * 上传文件(可供Action/Controller层使用)

     * @param hostname FTP服务器地址

     * @param port FTP服务器端口号

     * @param username FTP登录帐号

     * @param password FTP登录密码

     * @param pathname FTP服务器保存目录

     * @param fileName 上传到FTP服务器后的文件名称

     * @param inputStream 输入文件流

     * @return

     */

    public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){

        boolean flag = false;

        FTPClient ftpClient = new FTPClient();

        ftpClient.setControlEncoding("UTF-8");

        try {

            //连接FTP服务器

            ftpClient.connect(hostname, port);

            //ftp端口的打开和关闭
            ftpClient.enterLocalPassiveMode();

            //登录FTP服务器

            ftpClient.login(username, password);

            //是否成功登录FTP服务器

            int replyCode = ftpClient.getReplyCode();

            if(!FTPReply.isPositiveCompletion(replyCode)){

                return flag;

            }



            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            ftpClient.makeDirectory(pathname);

            ftpClient.changeWorkingDirectory(pathname);

            ftpClient.storeFile(fileName, inputStream);

            inputStream.close();

            ftpClient.logout();

            flag = true;

        } catch (Exception e) {

            e.printStackTrace();

        } finally{

            if(ftpClient.isConnected()){

                try {

                    ftpClient.disconnect();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

        return flag;

    }





    /**

     * 上传文件(可对文件进行重命名)

     * @param hostname FTP服务器地址

     * @param port FTP服务器端口号

     * @param username FTP登录帐号

     * @param password FTP登录密码

     * @param pathname FTP服务器保存目录

     * @param filename 上传到FTP服务器后的文件名称

     * @param originfilename 待上传文件的名称(绝对地址)

     * @return

     */

    public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){

        boolean flag = false;

        try {

            InputStream inputStream = new FileInputStream(new File(originfilename));

            flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return flag;

    }



    /**

     * 上传文件(不可以进行文件的重命名操作)

     * @param hostname FTP服务器地址

     * @param port FTP服务器端口号

     * @param username FTP登录帐号

     * @param password FTP登录密码

     * @param pathname FTP服务器保存目录

     * @param originfilename 待上传文件的名称(绝对地址)

     * @return

     */

    public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){

        boolean flag = false;

        try {

            String fileName = new File(originfilename).getName();

            InputStream inputStream = new FileInputStream(new File(originfilename));

            flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return flag;

    }





    /**

     * 删除文件

     * @param hostname FTP服务器地址

     * @param port FTP服务器端口号

     * @param username FTP登录帐号

     * @param password FTP登录密码

     * @param pathname FTP服务器保存目录

     * @param filename 要删除的文件名称

     * @return

     */

    public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){

        boolean flag = false;

        FTPClient ftpClient = new FTPClient();

        try {

            //连接FTP服务器

            ftpClient.connect(hostname, port);

            //登录FTP服务器

            ftpClient.login(username, password);

            //验证FTP服务器是否登录成功

            int replyCode = ftpClient.getReplyCode();

            if(!FTPReply.isPositiveCompletion(replyCode)){

                return flag;

            }

            //切换FTP目录

            ftpClient.changeWorkingDirectory(pathname);

            ftpClient.dele(filename);

            ftpClient.logout();

            flag = true;

        } catch (Exception e) {

            e.printStackTrace();

        } finally{

            if(ftpClient.isConnected()){

                try {

                    ftpClient.logout();

                } catch (IOException e) {

                }

            }

        }

        return flag;

    }



    /**

     * 下载文件

     * @param hostname FTP服务器地址

     * @param port FTP服务器端口号

     * @param username FTP登录帐号

     * @param password FTP登录密码

     * @param pathname FTP服务器文件目录

     * @param filename 文件名称

     * @param localpath 下载后的文件路径

     * @return

     */

    public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){

        boolean flag = false;

        FTPClient ftpClient = new FTPClient();

        try {

            //连接FTP服务器

            ftpClient.connect(hostname, port);

            //登录FTP服务器

            ftpClient.login(username, password);

            //验证FTP服务器是否登录成功

            int replyCode = ftpClient.getReplyCode();

            if(!FTPReply.isPositiveCompletion(replyCode)){

                return flag;

            }

            //切换FTP目录

            ftpClient.changeWorkingDirectory(pathname);

            FTPFile[] ftpFiles = ftpClient.listFiles();

            for(FTPFile file : ftpFiles){

                if(filename.equalsIgnoreCase(file.getName())){

                    File localFile = new File(localpath + "/" + file.getName());

                    OutputStream os = new FileOutputStream(localFile);

                    ftpClient.retrieveFile(file.getName(), os);

                    os.close();

                }

            }

            ftpClient.logout();

            flag = true;

        } catch (Exception e) {

            e.printStackTrace();

        } finally{

            if(ftpClient.isConnected()){

                try {

                    ftpClient.logout();

                } catch (IOException e) {



                }

            }

        }

        return flag;

    }


}

 

后端代码: 

@RequestMapping("/jdFtp/submitFtp")
    @ApiOperation(value = "警灯配置页提交", notes = "警灯配置页提交", httpMethod = "POST")
    public ApiResult<Map<String, Object>> submitFtp(@RequestParam("type") String type, @RequestParam  String fileName,@RequestParam("file") MultipartFile file) throws IOException {
        File f = transferToFile(file);
        QueryWrapper<JdFtpUpload> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("jd_ftp_type", type);
        queryWrapper.isNotNull("jd_ftp_type");
        List<JdFtpUpload> list = jingDengFtpService.list(queryWrapper);
        if(list.size()>0){
            for (int i = 0; i <list.size() ; i++) {
                if(fileName.equals(list.get(i).getJdFtpName())){
                    FileInputStream in =new FileInputStream(f);
                    FavFTPUtil.uploadFile(ip,port,user,
                            password,list.get(i).getJdFtpPath(),list.get(i).getJdFtpName(),in);
                }else {
                    return new ApiResult<>(-1, "该文件名不存在与对应类型的表格内,请仔细核对");
                }
            }
        }else {
            return new ApiResult<>(-1, "该文件类型不存在数据,请联系研发人员添加");
        }


        return new ApiResult<>(0, "提交成功");
    }


    private File transferToFile(MultipartFile multipartFile) throws IOException {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File toFile = null;
        if (multipartFile.equals("") || multipartFile.getSize() <= 0) {
            multipartFile = null;
        } else {
            InputStream ins = null;
            ins = multipartFile.getInputStream();
            toFile = new File(multipartFile.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其实MultipartFile不转为File应该也可以的。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Java上传文件FTP服务器的示例代码: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FTPUploader { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String username = "your-username"; String password = "your-password"; File fileToUpload = new File("path/to/file.txt"); // 要上传的文件路径 FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(username, password); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); FileInputStream fileInputStream = new FileInputStream(fileToUpload); String remoteFile = "uploaded-file.txt"; // 远程服务器上保存的文件名 boolean uploaded = ftpClient.storeFile(remoteFile, fileInputStream); fileInputStream.close(); if (uploaded) { System.out.println("文件上传成功!"); } else { System.out.println("文件上传失败!"); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 以上代码使用了Apache Commons Net库来处理FTP相关操作。你需要将`server`、`port`、`username`和`password`替换为你的FTP服务器的相关信息,将`fileToUpload`替换为你要上传的文件路径,`remoteFile`替换为在服务器上保存的文件名。 请确保你的项目中包含了Apache Commons Net库的依赖。你可以在Maven项目中添加以下依赖: ```xml <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.8.0</version> </dependency> ``` 希望对你有所帮助!如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值