友情链接 基于Docker快速安装FastDFS服务
1,引入工程必须的依赖包
<!--集成SpringBoot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<!--依赖包-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
</dependencies>
2,配置FastDFS
在resources文件夹下创建fasfDFS的配置文件fdfs_client.conf
connect_timeout=60 #连接超时时间,单位为秒。
network_timeout=60 #通信超时时间,单位为秒。发送或接收数据时。假设在超时时间后还不能发送或接收数据,则本次网络通信失败
charset=UTF-8 #字符编码
http.tracker_http_port=8080 #tracker配置的nginx服务http端口
tracker_server=166.171.221.12:22122 #tracker服务器IP和端口设置
3,配置application.yml
在resources文件夹下创建application.yml
spring:
servlet:
multipart:
max-file-size: 10MB #单个文件大小
max-request-size: 10MB #总上传的数据大小
server:
port: 9008
4,创建启动器FileApplication
@SpringBootApplication
public class FileApplication {
public static void main(String[] args) {
SpringApplication.run(FileApplication.class);
}
}
5,文件信息封装
文件上传一般都有文件的名字、文件的内容、文件的扩展名、文件的md5值、文件的作者等相关属性,我们可以创建一个对象封装这些属性,代码如下:
创建FastDFSFile,文件如下:
public class FastDFSFile implements Serializable {
//文件名字
private String name;
//文件内容
private byte[] content;
//文件扩展名
private String ext;
//文件MD5摘要值
private String md5;
//文件创建作者
private String author;
public FastDFSFile(String name, byte[] content, String ext, String md5, String author) {
this.name = name;
this.content = content;
this.ext = ext;
this.md5 = md5;
this.author = author;
}
public FastDFSFile(String name, byte[] content, String ext) {
this.name = name;
this.content = content;
this.ext = ext;
}
public FastDFSFile() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getExt() {
return ext;
}
public void setExt(String ext) {
this.ext = ext;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
6,编写上传文件工具类
package com.lailai.util;
import com.lailai.file.FastDFSFile;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 描述
*
* @author cuichang
* @version 1.0
* @package com.lailai.util
* @since 1.0
*/
public class FastDFSClient {
static {
//从classpath下获取文件对象获取路径
String path = new ClassPathResource("fdfs_client.conf").getPath();
try {
ClientGlobal.init(path);
} catch (Exception e) {
e.printStackTrace();
}
}
//图片上传
public static String[] upload(FastDFSFile file) {
try {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
//参数1 字节数组
//参数2 扩展名(不带点)
//参数3 元数据( 文件的大小,文件的作者,文件的创建时间戳)
NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())};
String[] strings = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
return strings;// strings[0]==group1 strings[1]=M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//图片下载
public static InputStream downFile(String groupName, String remoteFileName) {
ByteArrayInputStream byteArrayInputStream = null;
try {
//3.创建trackerclient对象
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
//5.创建stroageserver 对象
//6.创建storageclient 对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//7.根据组名 和 文件名 下载图片
//参数1:指定组名
//参数2 :指定远程的文件名
byte[] bytes = storageClient.download_file(groupName, remoteFileName);
byteArrayInputStream = new ByteArrayInputStream(bytes);
return byteArrayInputStream;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (byteArrayInputStream != null) {
byteArrayInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
//图片删除
public static void deleteFile(String groupName, String remoteFileName) {
try {
//3.创建trackerclient对象
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
//5.创建stroageserver 对象
//6.创建storageclient 对象
StorageClient storageClient = new StorageClient(trackerServer, null);
int i = storageClient.delete_file(groupName, remoteFileName);
if (i == 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
//根据组名获取组的信息
public static StorageServer getStorages(String groupName) {
try {
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
//参数1 指定traqckerserver 对象
//参数2 指定组名
StorageServer group1 = trackerClient.getStoreStorage(trackerServer, groupName);
return group1;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//根据文件名和组名获取文件的信息
public static FileInfo getFile(String groupName, String remoteFileName) {
try {
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
//参数1 指定组名
//参数2 指定文件的路径
FileInfo fileInfo = storageClient.get_file_info(groupName, remoteFileName);
return fileInfo;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//根据文件名和组名 获取组信息的数组信息
public static ServerInfo[] getServerInfo(String groupName, String remoteFileName){
try {
//3.创建trackerclient对象
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
ServerInfo[] group1s = trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
return group1s;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//获取tracker 的ip和端口的信息
//http://166.171.221.12:8080
public static String getTrackerUrl(){
try {
//3.创建trackerclient对象
TrackerClient trackerClient = new TrackerClient();
//4.创建trackerserver 对象
TrackerServer trackerServer = trackerClient.getConnection();
//tracker 的ip的信息
String hostString = trackerServer.getInetSocketAddress().getHostString();
//http://166.171.221.12:8080/group1/M00/00/00/A11C9a26Y17s14DFRK2D.jpg
int g_tracker_http_port = ClientGlobal.getG_tracker_http_port();
return "http://" + hostString + ":" + g_tracker_http_port;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
7,编写Controller接口
package com.lailai.file.controller;
import com.lailai.file.FastDFSFile;
import com.lailai.util.FastDFSClient;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* 描述
*
* @author cuichang
* @version 1.0
* @package com.lailai.file.controller
* @since 1.0
*/
//跨域:
//不同的域名A 访问 域名B 的数据就是跨域
// 端口不同 也是跨域 loalhost:18081----->localhost:18082
// 协议不同 也是跨域 http://www.taobao.com ---> https://www.taobao.com
// 域名不同 也是跨域 http://www.taobao.com ---> http://www.taobao.com
//协议一直,端口一致,域名一致就不是跨域 http://www.taobao.com:80 --->http://www.taobao.com:80 不是跨域
@RestController
@CrossOrigin//支持跨域
public class FileController {
/**
* 返回 图片的全路径
*
* @param file 页面的文件对象
* @return
*/
@PostMapping("/upload")
public String upload(@RequestParam(value = "file") MultipartFile file) {
try {
//1. 创建图片文件对象(封装)
//2. 调用工具类实现图片上传
//String substring = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
FastDFSFile fastdfsfile = new FastDFSFile(
file.getOriginalFilename(),//原来的文件名 1234.jpg
file.getBytes(),//文件本身的字节数组
StringUtils.getFilenameExtension(file.getOriginalFilename())
);
String[] upload = FastDFSClient.upload(fastdfsfile);
// upload[0] group1
// upload[1] M00/00/00/A11C9a26Y17s14DFRK2D.jpg
//3. 拼接图片的全路径返回
// http://166.171.221.12:8080/group1/M00/00/00/A11C9a26Y17s14DFRK2D.jpg
// http://166.171.221.12:8080 +
return FastDFSClient.getTrackerUrl()+"/"+upload[0]+"/"+upload[1];
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
8,使用Postman测试文件上传
步骤:
1、选择post请求方式,输入请求地址 http://localhost:18082/upload
2、填写Headers
Key:Content-Type
Value:multipart/form-data
3、填写body选择form-data 然后选择文件file 点击添加文件,最后发送即可。
4,访问服务器返回的图片地址链接
版权声明:本文为weixin_42293359原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。