FTP上傳下載圖片

ftp上傳下載通用模板

  • Controller層調(diào)用,返回FTP目錄相對(duì)地址
 @RequestMapping("uploadImg")
    @ResponseBody
    public Map<String, Object> uploadImg(@RequestParam(value = "editormd-image-file", required = false) MultipartFile file) {
//        Map<String, Object> result = new HashMap<>();
//        // 獲取圖片原名稱
//        String imgName = file.getOriginalFilename();
//        // 圖片重命名
//        String reImgName = UUIDUtils.getUUID(10) + imgName.substring(imgName.lastIndexOf("."));
//        //保存
//        try {
//            byte[] bytes = file.getBytes();
//            Path path = Paths.get(imagePath + reImgName);
//            Files.write(path, bytes);
//            result.put("success", 1);
//            result.put("message", "上傳成功!");
//            result.put("url", uploadImage + reImgName);
//        } catch (Exception e) {
//            result.put("success", 0);
//            result.put("message", "上傳失??!");
//            e.printStackTrace();
//        }

//        return result;
        Map<String, Object> result = new HashMap<>();
        try {
            String url = ftpUtil.upload(file.getInputStream(), file.getOriginalFilename());
            result.put("success", 1);
            result.put("message", "上傳成功!");
            result.put("url", "http://127.0.0.1:9999"+url);
        } catch (IOException e) {
            result.put("success", 0);
            result.put("message", "上傳失?。?);
            e.printStackTrace();
        }
        return result;

    }
  • FTP封裝的工具類
package com.typ.blog.utils;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class FtpUtil {
    //ftp服務(wù)器ip地址
    String FTP_ADDRESS="127.0.0.1";//如果是自己買的服務(wù)器那就寫自己服務(wù)器的IP地址
    //端口號(hào)
    Integer FTP_PORT=21;
    //用戶名
    String FTP_USERNAME="ftptest";
    //密碼
    String FTP_PASSWORD="ftptest";
    //圖片路徑
    String FTP_BASEPATH="/var/ftp/test/";
    /** 本地字符編碼 */
    private static String LOCAL_CHARSET = "GBK";

    // FTP協(xié)議里面,規(guī)定文件名編碼為iso-8859-1
    private static String SERVER_CHARSET = "ISO-8859-1";

    //根據(jù)當(dāng)前文件生成 文件夾
    private static String getTimePath() {
        Date now = new Date();

        DateFormat format = new SimpleDateFormat("yyyy/MM/dd/");
        return format.format(now);
    }

    /**
     * author : wangwei
     * description: 使用ftp 上傳文件
     * date:      2019/6/5
     */

    public String upload(InputStream inputStream, String originName) {

        StringBuilder url = new StringBuilder();

        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 連接FTP服務(wù)器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登錄
            reply = ftp.getReplyCode();
            System.out.println("reply:" + reply);

            ftp.enterLocalPassiveMode();//開啟被動(dòng)模式,否則文件上傳不成功,也不報(bào)錯(cuò)

            String timePath = getTimePath();
            String saveDir = FTP_BASEPATH + timePath;
            url.append(saveDir);
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            createDir(ftp, saveDir);
            originName = UUIDUtils.getUUID(10)+originName.substring(originName.lastIndexOf("."));
            url.append(originName);
            ftp.storeFile(originName, inputStream);
            inputStream.close();
            ftp.logout();

        } catch (IOException e) {
            throw new RuntimeException("文件上傳失敗");
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }

        return url.toString();
    }

    /**
     *
     * 下載圖片轉(zhuǎn)換成Base64
     * */
    public String download(String ftpUrl,String sfzh){
        FTPClient ftpClient = new FTPClient();
        InputStream inputStream = null;
        String re=null;
        try {
            ftpClient.connect(FTP_ADDRESS,FTP_PORT);
            ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

            //是否成功登錄服務(wù)器
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
            }
            //跳轉(zhuǎn)到指定目錄
            ftpClient.changeWorkingDirectory(ftpUrl);
            //設(shè)置被動(dòng)模式,防止在Linux上,由于安全限制,可能某些端口沒有開啟,出現(xiàn)阻塞
            ftpClient.enterLocalPassiveMode();
            //讀取圖片需要添加該方法
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            //5.遍歷下載的目錄
            FTPFile[] fs = ftpClient.listFiles();
            for (FTPFile ff : fs){
                //解決中文亂碼問題,兩次解碼
//                byte[] bytes=ff.getName().getBytes("iso-8859-1");
//                String fileName=new String(bytes,"utf-8");
//                if(sfzh.equals(fileName)){
//                    inputStream = ftpClient.retrieveFileStream(fileName);
//                }
                byte[] bytes=ff.getName().getBytes("iso-8859-1");
                String fileName=new String(bytes,"utf-8");
                inputStream = ftpClient.retrieveFileStream(fileName);

            }

            if (inputStream != null) {
                byte[] data=null;
                data=new byte[inputStream.available()];
                inputStream.read(data);
                BASE64Encoder encoder=new BASE64Encoder();
                re=encoder.encode(data);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(ftpClient.isConnected()){
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(null != inputStream){
                try {
                    inputStream.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return re;
    }

    // 創(chuàng)建文件夾,并切換到該文件夾
    // 比如: hello/test
    //最終會(huì)切換到test 文件夾返回
    private void createDir(FTPClient client, String path) throws IOException {
        String[] dirs = path.split("/");
        for (String dir : dirs) {
            if (StringUtils.isEmpty(dir)) {
                continue;
            }
            if (!client.changeWorkingDirectory(dir)) {
                client.makeDirectory(dir);
            }
            client.changeWorkingDirectory(dir);
        }
    }
}
  • 項(xiàng)目實(shí)測(cè)


    image.png
  • 顯示效果


    image.png
  • 在FTP服務(wù)器中查看上傳的圖片文件(直接從瀏覽器中打開)


    image.png

ps:記錄下載和上傳的實(shí)際調(diào)用

@CrossOrigin
public class FtpController {

    @Autowired
    FtpUtil fileUtil;//(就是上面的FTP封裝的工具類)
  //圖片上傳
    @PostMapping("/upload2")
    public String uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {

        String url = fileUtil.upload(file.getInputStream(), file.getOriginalFilename());
        return url;

    }

   //圖片下載轉(zhuǎn)base64
    @GetMapping("/download")
    public String download(HttpServletRequest request) throws IOException {
                                           //ftp服務(wù)器的相對(duì)路徑 //圖片的名字
        String url = fileUtil.download("var/ftp/test2021/03/17","1615967386819.jpg");
        return url;

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容