文档章节

121 项目 016 笔记向 spring boot + nginx +filezilla 文件上传

小代码2016
 小代码2016
发布于 2017/02/17 20:49
字数 2106
阅读 211
收藏 1

filezilla 安装

FileZilla 分为客户端与服务端,我使用的是xampp自带的FileZilla服务端,客户端是直接百度搜索下载的

xampp 中的 FileZilla

首先启动 FileZilla 服务

输入图片说明

然后点 admin ,会弹出 登陆窗口,这里可以写密码

输入图片说明

然后点击 编辑->用户

输入图片说明

输入图片说明

点击常规,添加一个用户,再勾选启用账户和密码,设置密码

点击共享文件夹

输入图片说明

点击添加,设置一个共享文件夹,还要设置文件夹的权限,这个就看你的需求了,这里我全部选上了

还得点击右边的添加,添加一个用户

现在FileZilla服务就算是配置好了

我的目录是:

F:\projectpath\bookstore\project\images

在这个文件夹里放一个图片,然后打开浏览器,输入以下地址

ftp://127.0.0.1/banner/banner.git.gif

也就是 ftp://127.0.0.1 后面跟上你图片在共享文件夹中的相对路径

会让你输入用户名和密码,这个用户名和密码是 编辑->用户 中设置的,不是一开始的寻个管理密码,然后就可以看到图片了

输入图片说明

FileZilla 客户端的使用

百度搜索即可

输入图片说明

安装过程不再赘述

打开 FileZilla 客户端

输入图片说明

点击 文件-> 站点管理

输入图片说明

点击新站点,输入主机名,登录类型选择正常,设置用户名和密码 注意:这里的用户名和密码是你在 xampp 中的 fileZilla 服务中创建的用户名和密码,然后点击确定即可

输入图片说明

然后再输入地址,用户名,密码,再点快速连接。端口号默认为21

登陆成功后,界面如下

输入图片说明

操作方法已在图中说明

代码

Spring Boot 配置

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.laolang.gongda.bookstore</groupId>
    <artifactId>bookstore</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <!--<packaging>war</packaging>-->

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- war -->

        <!--import org.springframework.boot.builder.SpringApplicationBuilder;-->
        <!--import org.springframework.boot.context.web.SpringBootServletInitializer;-->

        <!--public class ServletInitializer extends SpringBootServletInitializer {-->

        <!--@Override-->
        <!--protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {-->
        <!--return application.sources(BootTwoApplication.class);-->
        <!--}-->

        <!--}-->

        <!--<dependency>-->
        <!--<groupId>org.springframework.boot</groupId>-->
        <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
        <!--<scope>provided</scope>-->
        <!--</dependency>-->

        <!-- /war -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>2.7.5</version>
        </dependency>

        <!-- apache -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>

        <!-- 时间操作 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.5</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>bookstore</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.properties



# server
server.port=8080
server.context-path=/

# log
logging.config=classpath:logback.xml
logging.path=F:/projectpath/bookstore/log


# jpa
spring.datasource.url=jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.show-sql=true


# beetl
spring.beetl.root = classpath:/templates/
spring.beetl.prefix =
spring.beetl.suffix = .html
spring.beetl.order = 0
spring.beetl.cofig = classpath:beetl.properties

#ftp 配置
ftp.address=127.0.0.1
ftp.port=21
ftp.userName=laolang
ftp.passWord=fcl1164891
ftp.basePath=/upload
ftp.imageBasePath=http://image.bookstore.com/images/upload

注意最后的ftp配置

ftp 配置类

FtpConfig

package com.laolang.gongda.bookstore.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "ftp")
public class FtpConfig {

//    ftp.address=127.0.0.1
//    ftp.port=21
//    ftp.userName=laolang
//    ftp.passWord=fcl1164891
//    ftp.basePath=/upload
//    ftp.imageBasePath=http://image.bookstore.com/images


    public FtpConfig() {
    }

    @Override
    public String toString() {
        return "FtpConfig{" +
                "address='" + address + '\'' +
                ", port=" + port +
                ", userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", basePath='" + basePath + '\'' +
                ", imageBasePath='" + imageBasePath + '\'' +
                '}';
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getBasePath() {
        return basePath;
    }

    public void setBasePath(String basePath) {
        this.basePath = basePath;
    }

    public String getImageBasePath() {
        return imageBasePath;
    }

    public void setImageBasePath(String imageBasePath) {
        this.imageBasePath = imageBasePath;
    }

    private String address;

    private Integer port;

    private String userName;

    private String passWord;

    private String basePath;

    private String imageBasePath;
}

其它的和普通 spring boot 项目没有什么区别

文件上传功能实现

IDUtils

package com.laolang.gongda.bookstore.utils;


import java.util.Random;

/**
 * 各种id生成策略
 * <p>Title: IDUtils</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.com</p>
 * @author	入云龙
 * @date	2015年7月22日下午2:32:10
 * @version 1.0
 */
public class IDUtils {

    /**
     * 图片名生成
     */
    public static String genImageName() {
        //取当前时间的长整形值包含毫秒
        long millis = System.currentTimeMillis();
        //long millis = System.nanoTime();
        //加上三位随机数
        Random random = new Random();
        int end3 = random.nextInt(999);
        //如果不足三位前面补0
        String str = millis + String.format("%03d", end3);

        return str;
    }

    /**
     * 商品id生成
     */
    public static long genItemId() {
        //取当前时间的长整形值包含毫秒
        long millis = System.currentTimeMillis();
        //long millis = System.nanoTime();
        //加上两位随机数
        Random random = new Random();
        int end2 = random.nextInt(99);
        //如果不足两位前面补0
        String str = millis + String.format("%02d", end2);
        long id = new Long(str);
        return id;
    }


}

此类的作用是生成随机的文件名

FtpUtil

package com.laolang.gongda.bookstore.utils;


import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;

/**
 * ftp上传下载工具类
 * <p>Title: FtpUtil</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.com</p>
 * @author	入云龙
 * @date	2015年7月29日下午8:11:51
 * @version 1.0
 */
public class FtpUtil {

    /**
     * Description: 向FTP服务器上传文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true,否则返回false
     */
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                                     String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                //如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * Description: 从FTP服务器下载文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 要下载的文件名
     * @param localPath 下载后保存到本地的路径
     * @return
     */
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                                       String fileName, String localPath) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + "/" + ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

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

这是 ftp 工具类

service && controller

service

PicUploadService

package com.laolang.gongda.bookstore.service;



import com.laolang.gongda.bookstore.config.FtpConfig;
import com.laolang.gongda.bookstore.utils.FtpUtil;
import com.laolang.gongda.bookstore.utils.IDUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Service
public class PicUploadService {

    @Autowired
    private FtpConfig ftpConfig;


    public String uploadPic(MultipartFile multipartFile) {
        if (null == multipartFile || multipartFile.isEmpty()) {
            return null;
        }

        String originalFilename = multipartFile.getOriginalFilename();
        String ext = originalFilename.substring(originalFilename.lastIndexOf("."));

        String imageName = IDUtils.genImageName();

        DateTime dateTime = new DateTime();
        String filePath = dateTime.toString("/yyyy/MM/dd");
        try {
            FtpUtil.uploadFile(ftpConfig.getAddress(), ftpConfig.getPort(), ftpConfig.getUserName(), ftpConfig.getPassWord(),
                    ftpConfig.getBasePath(), filePath, imageName + ext, multipartFile.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }


        return ftpConfig.getImageBasePath() + filePath + "/" + imageName + ext;
    }
}

controller

UploadController

package com.laolang.gongda.bookstore.web;


import com.laolang.gongda.bookstore.service.PicUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;


@Controller
public class UploadController {

    @Autowired
    private PicUploadService picUploadService;


    @RequestMapping(value = "/upload")
    public String uploadForm(){
        return "upload";
    }

    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public String upload( @RequestParam("file")MultipartFile multipartFile , Model model){

        System.out.println("hello");
        System.out.println("world");

        String result = picUploadService.uploadPic(multipartFile);

        if( null == result ){
            result = "上传失败";
        }

        System.out.println(result);
        model.addAttribute("msg",result);
        return "result";
    }
}

页面 && 使用

upload.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<form action="/upload" enctype="multipart/form-data" method="post">
    <p>文件:<input type="file" name="file"/></p>
    <p><input type="submit" value="上传"/></p>
</form>

</body>
</html>

使用效果

输入图片说明

输入图片说明

上传后,如果没有错误,就会返回对应的地址,这里我使用了 nginx,加了一个域名

nginx 的简单配置可见:121 项目 015 笔记向 windows + nginx + tomcat 简单配置

在浏览器中输入此域名即可看到图片

输入图片说明

© 著作权归作者所有

小代码2016
粉丝 41
博文 328
码字总数 153495
作品 0
安阳
程序员
私信 提问
Spring Boot Banner自定义,让你的应用与众不同

点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达! TIPS 本文基于Spring Boot 2.1.4,理论支持Spring Boot所有版本。 相信玩过Spring Boot的童鞋一定在启动日志中见过类似如下的内容。...

IT牧场
05/08
0
0
Java实现把图片上传到图片服务器(nginx+vsftp)

前言: 在我另一篇笔记中已经记载了如何用nginx + vsftp搭建图片服务器(请参考nginx + vsftp搭建图片服务器),并且用vsftp的客户端工具filezilla测试过已经可用。但是在开发中应该是把用户在前...

贪挽懒月
2018/05/30
0
0
Spring Boot 之 HelloWorld 与 多文件上传详解

0、用到的框架和组件如下: Spring Boot 1.4.3.RELEASE Spring 4.3.5.RELEASE Thymeleaf jQuery (webjars) Maven Embedded Tomcat 8.5.6 Google Chrome Browser (Network Inspect) 附:Sprin......

大数据之路
2012/11/23
0
0
Spring Boot学习笔记

多模块开发 [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目 RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装...

OSC_fly
2018/07/26
0
0
Spring Boot实战 目录

书名: Spring Boot实战 定价: 59.00元 出版社名称: 人民邮电出版社 出版日期:2016年8月 作者: Craig Walls ISBN编号: 9787115433145 内容简介 本书以Spring应用程序开发为中心,全面讲解如何...

程序员诗人
2017/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Visual Paradigm 教程[UML]:如何绘制封装图?(上)

下载Visual Paradigm最新试用版 查看本教程视频文件 在项目开始时,您只有有限数量的图表,一切都简单而美观。然而,当时间过得匆匆时,已经创建了越来越多的图表,并且它们开始变得无法管理...

xiaochuachua
30分钟前
0
0
Pure-ftpd服务安装及虚拟用户设置

安装 sudo apt-get install pure-ftpd 虚拟用户设置 首先,可以在系统中添加相应的用户和组,如用户ftpuser 和组ftpgroup ,专门用来管理ftp服务。也可以是能登录系统的用户,但最好是不能登...

Gm_ning
32分钟前
0
0
一位面试了阿里,滴滴,网易,蚂蚁金服,最终有幸去了网易的Java程序员【面试题分享】

前言 15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去...

Java领航员
34分钟前
1
0
“大团队”和“敏捷开发”,谁说不可兼得?

阿里妹导读:当小团队的产出跟不上业务需要,团队就面临规模化的问题。从1个团队到3个团队,仍可以通过简单的团队沟通保持高效协作。当产品复杂到需要5个以上团队同时开发时,我们需要一定的...

阿里云云栖社区
37分钟前
0
0
基于虹软人脸识别Demo android人脸识别

参加一个比赛,指定用虹软的人脸识别功能,奈何虹软人脸识别要自己建人脸库,不然就只能离线用,总不能装个样子,简单看了下虹软Demo,下面决定用这种简单方法实现在线人脸识别: Android端(...

是哇兴哥棒棒哒
42分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部