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应该也可以的。

Logo

前往低代码交流专区

更多推荐