springboot图片上传至Linux的ftp服务器

文件上传

Controller

 	@RequestMapping("/upload")
    @ResponseBody
    public Map<String,String> uploadImg(@RequestParam("file") MultipartFile file, Model model,HttpServletRequest request) throws IOException{
        return fileService.upfile(file,request);
    }

Service层

public  Map<String, String> upfile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
        Map<String, String> map = new HashMap<>();
        map.put("code", "1");
        map.put("msg", "上传文件失败");
        String fileName = System.currentTimeMillis()+file.getOriginalFilename();//获取文件名

        //上传的文件名也需要加上后缀,不然虚拟机不知道文件格式
        InputStream inputStream = file.getInputStream();
        String filePath = null;
        Boolean flag = ftpUtil.uploadFile(fileName, inputStream);//主要就是这里实现了ftp的文件上传
        if (flag == true) {
            //log.info("上传文件成功!");
            filePath = ftpUtil.FTP_BASEPATH + fileName;
            map.put("code", "0");
            map.put("msg", "上传文件成功");
            map.put("fileName",fileName);
        }
        map.put("path", filePath);
        System.out.println(map);
        return map;
    }

FtpUtil

@Component//这就是我们刚才加入的依赖
public class FtpUtil {

    //ftp服务器ip地址
    private static final String FTP_ADDRESS = "192.168.111.136";
    //端口号
    private static final int FTP_PORT = 21;
    //用户名
    private static final String FTP_USERNAME = "lichenyang";
    //密码
    private static final String FTP_PASSWORD = "mxy480225354";
    //路径都是/home/加上用户名
    public final String FTP_BASEPATH = "/home/ftp/data";

    //参数传过来了文件和文件的输入流
    public boolean uploadFile(String originFileName, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();//这是最开始引入的依赖里的方法
        ftp.setControlEncoding("utf-8"); //设置编码
        ftp.enterLocalPassiveMode();  //设置被动连接
        try {
            int reply;
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            reply = ftp.getReplyCode();//连接成功会的到一个返回状态码
            System.out.println(reply);//可以输出看一下是否连接成功
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型
            ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); //设置流方式
            ftp.changeWorkingDirectory(FTP_BASEPATH);//修改操作空间
//对了这里说明一下你所操作的文件夹必须要有可读权限,chomd 777 文件夹名//这里我就是用的我的home文件夹
            System.out.println(originFileName);
            boolean state = ftp.storeFile(originFileName, input);//这里开始上传文件
            System.out.println(ftp.getReplyString());  //如果错误,打印错误信息
            System.out.println(state);
            if (!FTPReply.isPositiveCompletion(reply)) {  //检查连接返回的状态码c
                ftp.disconnect();
                System.out.println("连接失败");
                return success;
            }
            System.out.println("连接成功!");

            input.close();
            ftp.logout();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }


    public boolean downloadFile(String filename, HttpServletResponse response) {
        boolean flag = false;
        FTPClient ftp = new FTPClient();
        OutputStream os = null;
        InputStream inputStream = null;
        String re=null;
        try {
            ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
            ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
            ftp.enterLocalPassiveMode();
            ftp.changeWorkingDirectory(FTP_BASEPATH);//跳转到指定目录
            FTPFile[] ftpFiles = ftp.listFiles();
            String picType;
//然后便利这个数组找出和我们要下载的文件的文件名一样的文件
            for (FTPFile file : ftpFiles) {
                //解决中文乱码,两次解码
                byte[] bytes = file.getName().getBytes("ISO-8859-1");
                file.setName(new String(bytes, "utf-8"));
                System.out.println("name: " + file.getName());//
                if (filename.equalsIgnoreCase(file.getName())) {//判断找到所下载的文件,file.getName就是服务器上对应的文件
//下面就是通过文件id再去数据库查找文件的中文名,将这个作为文件名下载到本地目录
                    System.out.println(true);
                    String fileName = file.getName();
                    inputStream = ftp.retrieveFileStream(fileName);
                    System.out.println("该文件的文件名:"+fileName);
                    picType = fileName.split("\\.")[1];
                    BufferedImage bufferedImage = null;
                    bufferedImage = ImageIO.read(inputStream);
                    os = response.getOutputStream();
                    ImageIO.write(bufferedImage,picType,os);
                    break;
                }
            }
            ftp.logout();
            flag = true;
            System.out.println("下载文件成功");
        } catch (Exception e) {
            System.out.println("下载文件失败");
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }
}

图片回显到前端页面

Controller

@RequestMapping("/loadImg")
    @ResponseBody
    public void loadImg(HttpServletResponse response,String fileName){
        boolean flag = false;
        //这里我要得到文件的id和type作为filename去下载,下载是通过filename去对应的目录查找文件名相同的文件下载下来,后台将文件名转换中文文件名。
        try {
            flag =  fileService.downfile(fileName,response);//下载调用service层的方法
            System.out.println(flag);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Service层

public boolean downfile(String filename, HttpServletResponse response) throws IOException {
        boolean flag ;//同样这里也是用ftpUtil这个工具类去下载,传入文件的存放地址和文件名,和文件在服务器上的地址
        flag = ftpUtil.downloadFile(filename,response);
        return flag;
    }

Layui前端页面

<div class="layui-upload">
        <button type="button" class="layui-btn" id="fileImage">上传图片</button>
        <div class="layui-upload-list">
            <img class="layui-upload-img" id="demo1" width="100px" height="100px">
            <p id="demoText"></p>
        </div>
        <input type="hidden" id="imageId">
    </div>
<script type="text/html" id="photo">
   <div>
       <img src="/loadImg?fileName={{d.imageId}}"  width="50px" height="50px"/>
       </div>
</script>
layui.use(['table','layer'], function(){
        $ = layui.jquery;
        table = layui.table;
        layer = layui.layer
        table.render({
            elem: '#test'
            ,url:'/member/listJson'
            ,toolbar: '#toolbarDemo'
            ,title: '用户数据表'
            ,height:500
            ,defaultToolbar: []
            ,cols: [
                 [
                {type: 'checkbox', fixed: 'left'}
                ,{field:'dyId', title:'党员ID',sort: true,align:'center',hide:true}
                ,{field:'imageId', title:'头像',width:100,align:'center',templet:'#photo'}
                ,{field:'dyName', title:'党员姓名', width:150,align:'center'}
                ,{field:'dySex', title:'性别', width:150,align:'center'}
                ,{field:'dyRdtime', title:'入党日期', width:150,align:'center'}
                ,{field:'dyPosition', title:'党内职务',width:150,align:'center'}
                ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150,align:'center'}
                ]
                ]
            ,page: true
            ,id:'MTable'
        });
 //图片上传
    layui.use('upload', function(){
        var $ = layui.jquery
            ,upload = layui.upload;
        var dyPhone = $("#dyPhone").val();
        //普通图片上传
        var uploadInst = upload.render({
            elem: '#fileImage'
            ,url: '/upload?dyPhone='+dyPhone
            ,accept:'file'
            ,size:50000
            ,multiple:true
            ,before: function(obj){
                obj.preview(function(index, file, result){
                    $('#demo1').attr('src', result);
                });
            }
            ,done: function(res){
                //如果上传失败
                if(res.code > 0){
                    return layer.msg('上传失败');
                }
                //上传成功
                var demoText = $('#demoText');
                demoText.html('<span style="color: #4cae4c;">上传成功</span>');
                var imageId = $("#imageId");
                imageId.attr('value',res.fileName);
            }
            ,error: function(){
                //演示失败状态,并实现重传
                var demoText = $('#demoText');
                demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
                demoText.find('.demo-reload').on('click', function(){
                    uploadInst.upload();
                });
            }
        });
    });
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whisper~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值