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

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 简单配置

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

输入图片说明

转载于:https://my.oschina.net/iamhere/blog/841152

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值