1、建立一个springboot的工程,下面的是我的目录结构:
2、pom文件引入依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 支持 @ConfigurationProperties 注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 1.5的版本默认采用的连接池技术是jedis 2.0以上版本默认连接池是lettuce,
在这里采用jedis,所以需要排除lettuce的jar -->
<exclusions>
<exclusion>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
<!-- 添加jedis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/ojdbc/ojdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<!-- http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<!-- 必须加上,jedis依赖此 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- 集成fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- 集成Swagger2形成API文档请求接口-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 文件服务器-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
<version>1.8.3</version>
</dependency>
</dependencies>
这个是方便在yml中自定义参数听过@Value的形式注入
这个依赖确保是1.26.1以上的不然SpringBoot2.0集成会报错
按照截图创建包以及建立类:
3、编写FdfsConfig 类
package com.saliai.logsystem.common.conf;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author: Martin
* @Date: 2018/10/12
* @Description:
* @Modify By:
*/
@Component
public class FdfsConfig {
@Value("${fdfs.res-host}")
private String resHost;
@Value("${fdfs.storage-port}")
private String storagePort;
public String getResHost() {
return resHost;
}
public void setResHost(String resHost) {
this.resHost = resHost;
}
public String getStoragePort() {
return storagePort;
}
public void setStoragePort(String storagePort) {
this.storagePort = storagePort;
}
}
4、编写 FdfsConfiguration 类
package com.saliai.logsystem.common.conf;
/**
* @author: Martin
* @Date: 2018/10/12
* @Description:
* @Modify By:
*/
import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
@Configuration
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FdfsConfiguration {
}
5、建立constants包并建立GlobalConstants类
package com.saliai.logsystem.common.constants;
/**
* @author: Martin
* @Date: 2018/10/25
* @Description:
* @Modify By:
*/
public class GlobalConstants {
public final static String HTTP_FILEURL = "http://baihoomall.100healths.cn";
}
6、创建截图中的FastDFSClientWrapper类:
package com.saliai.logsystem.common.utils;
/**
* @author: Martin
* @Date: 2018/9/28
* @Description:
* @Modify By:
*/
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.saliai.logsystem.common.conf.FdfsConfig;
import com.saliai.logsystem.common.constants.GlobalConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 功能描述: 文件处理类
*
* @author Martin
* @version V1.0
* @date 2018/10/12
*/
@Component
@Slf4j
public class FastDFSClientWrapper {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private FdfsConfig fdfsConfig;
public String uploadFile(MultipartFile file) throws IOException {
StorePath storePath = storageClient.uploadFile((InputStream) file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
log.info("storePath:" + storePath);
return getResAccessUrl(storePath);
}
/**
* 封装文件完整URL地址
*
* @param storePath
* @return
*/
private String getResAccessUrl(StorePath storePath) {
//GlobalConstants.HTTP_PRODOCOL +
String fileUrl = GlobalConstants.HTTP_FILEURL + ":" + fdfsConfig.getStoragePort() + "/" + storePath.getFullPath();
log.info("fileUrl:" + fileUrl);
return fileUrl;
}
/**
* 功能描述: 删除文件
*
* @param fileUrl
* @return void
* @author Martin
* @date 2018/10/12
* @version V1.0
*/
public void deleteFile(String fileUrl) {
log.info("删除的文件的url:" + fileUrl);
if (StringUtils.isEmpty(fileUrl)) {
return;
}
try {
StorePath storePath = StorePath.praseFromUrl(fileUrl);
log.info("groupName:"+storePath.getGroup()+"------"+"文件路径path:"+storePath.getPath());
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
} catch (FdfsUnsupportStorePathException e) {
log.warn(e.getMessage());
}
}
/**
* 功能描述: 下载文件
*
* @param fileUrl
* @return java.io.InputStream
* @author Martin
* @date 2018/10/12
* @version V1.0
*/
public InputStream downFile(String fileUrl) {
try {
StorePath storePath = StorePath.praseFromUrl(fileUrl);
byte[] fileByte = storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadByteArray());
InputStream ins = new ByteArrayInputStream(fileByte);
return ins;
} catch (Exception e) {
log.error("Non IO Exception: Get File from Fast DFS failed", e);
}
return null;
}
}
7、接下来编写controller进行测试
package com.saliai.logsystem.controller;
import com.saliai.logsystem.common.utils.FastDFSClientWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.io.IOException;
/**
* @author: Martin
* @Date: 2018/9/28
* @Description:
* @Modify By:
*/
@Controller
@RequestMapping("/upload")
public class UploadController {
@Autowired
private FastDFSClientWrapper dfsClient;
@GetMapping("/")
public String index() {
return "upload/upload";
}
@PostMapping("/fdfs_upload")
public String fdfsUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
return "redirect:/upload/uploadStatus";
}
try {
String fileUrl = dfsClient.uploadFile(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded '" + fileUrl + "'");
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/upload/uploadStatus";
}
@GetMapping("/uploadStatus")
public String uploadStatus() {
return "upload/uploadStatus";
}
@RequestMapping("/deleteFile")
@ResponseBody
public String deleteFile(@RequestParam(value = "fileUrl") String fileUrl) {
dfsClient.deleteFile(fileUrl);
return "Success";
}
}
8、建立页面测试上传功能。这里使用freemarker
upload.ftl:
<!DOCTYPE html>
<html>
<body>
<h1>Spring Boot file upload example</h1>
<form method="POST" action="/upload/fdfs_upload" enctype="multipart/form-data">
<input type="file" name="file" /><br/><br/>
<input type="submit" value="Submit" />
</form>
</body>
</html>
uploadStatus.ftl:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<h1>Spring Boot - Upload Status</h1>
<div>
<h1>${message}</h1>
</div>
</body>
</html>
在启动类中加上@EnableAutoConfiguration注解
在配置文件中加入这两个截图的东西:
9、启动项目,进行测试
提交,进行文件上传:
返回文件的地址,直接拷贝到浏览器访问,看看是否能访问。
这样就完成了文件上传的步骤。