文件上传+Fastdfs+AjaxResult
1、Fastdfs
概念:
- FastDFS是一套高性能的文件服务器集群,他提供了文件上传、下载等服务。(用他对文件进行统一的处理,一般在微服务中我们把它用来对图片进行统一的处理,他就是一个单独的微服务)
1.1 linux操做系统安装(配置)fastdfs
一般使用 fastdfs都是在linux上进行操做的(相当于在linux上安装fastdfs,然后再把图片上传到fastdfs)
- 配置Fastdfs(在linux上进行cmd终端,执行以下命令)
1.修改client.conf
vi /etc/fdfs/client.conf -> 把ip修改为当前虚拟机ip
2.修改storage.conf
vi /etc/fdfs/storage.conf -> 把ip修改为当前虚拟机ip
3.启动fastdfs
#注意这里两个都要启动
service fdfs_trackerd start
service fdfs_storaged start
4.查看是否启动成功
netstat -unltp|grep fdfs
5.查看监控信息
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
6.启动Nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
7.关闭防火墙/开放防火墙 80 端口
service iptables stop
或者执行:
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/rc.d/init.d/iptables save
注意:网络使用的是桥接模式
8.测试Nginx
在虚拟机里面: curl http://127.0.0.1:80
在宿主机测试:浏览器访问 http://127.0.0.1:80
9.测试上传(上传到fastdfs)
fdfs_test /etc/fdfs/client.conf upload /root/虚拟机里面的图片.jpg
1.2 java代码Hello的简单测试
1、打jar包
- 手动到网上去下载源码然后将源码打jar包到maven仓库
- 将这个源码下载完后进入根目录里面然后cmd执行下面的命令,就能自动进行打包
使用maven从源码安装:mvn clean install
2、导包
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
3、添加配置文件fdfs_client.conf ,将其中的服务器地址设置为虚拟机ip.22122(后面的不是端口)
//…
tracker_server=192.168.25.133:22122
//…
// 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。
ClientGlobal.init("D:/maven_work/fastDFS-demo/src/fdfs_client.conf");
// 2、创建一个 TrackerClient 对象。直接 new 一个。
TrackerClient trackerClient = new TrackerClient();
// 3、使用 TrackerClient 对象创建连接,获得一个 TrackerServer 对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、创建一个 StorageServer 的引用,值为 null
StorageServer storageServer = null;
// 5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、使用 StorageClient 对象上传图片。
//扩展名不带“.”
String[] strings = storageClient.upload_file("D:/pic/benchi.jpg", "jpg",
null);
// 7、返回数组。包含组名和图片的路径。
for (String string : strings) {
System.out.println(string);
}
控制台输出如下结果:
group1
M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg
在浏览器输入:
http://192.168.25.133/group1/M00/00/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg
2、Fastdfs集成微服务
2.1 导入依赖
<dependencies>
<!-- 注册中心客户端包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 集成Web的jar包,客户端必须要加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--引入swagger支持-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!--fastdfs-->
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
<!--截取后缀名的工具类jar包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
2.2 主配置类开启fastdfs服务
@SpringBootApplication
@EnableEurekaClient
public class FastdfsApp_2040 {
public static void main( String[] args ){
SpringApplication.run(FastdfsApp_2040.class);
}
}
2.3 配置文件(application.yml)
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1010/eureka/ #注册中心服务端的注册地址
instance:
prefer-ip-address: true #使用ip进行注册
instance-id: fastdfs-server:2040 #服务注册到注册中心的id
server:
port: 2040
#应用的名字
spring:
application:
name: fastdfs-server
2.4 fastdfs的配置
fdfs_client.conf(配置文件名就叫这个)
tracker_server=虚拟机ip:22122
2.5 拷贝FastDfsApiOpr工具类
直接拷贝使用即可(里面包含了上传、下载、删除等操做,可以直接使用这个工具类来调用)
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
public class FastDfsApiOpr {
public static String CONF_FILENAME = FastDfsApiOpr.class.getClassLoader()
.getResource("fast_client.conf").getFile();
/**
* 上传文件
* @param file
* @param extName
* @return
*/
public static String upload(byte[] file,String extName) {
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//扩展(可以不要)
/*NameValuePair nvp [] = new NameValuePair[]{
new NameValuePair("age", "18"),
new NameValuePair("sex", "male")
};*/
String fileIds[] = storageClient.upload_file(file,extName,null);
System.out.println(fileIds.length);
System.out.println("组名:" + fileIds[0]);
System.out.println("路径: " + fileIds[1]);
return "/"+fileIds[0]+"/"+fileIds[1];
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 上传文件
* @param extName
* @return
*/
public static String upload(String path,String extName) {
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
String fileIds[] = storageClient.upload_file(path, extName,null);
System.out.println(fileIds.length);
System.out.println("组名:" + fileIds[0]);
System.out.println("路径: " + fileIds[1]);
return "/"+fileIds[0]+"/"+fileIds[1];
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 下载文件
* @param groupName
* @param fileName
* @return
*/
public static byte[] download(String groupName,String fileName) {
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
byte[] b = storageClient.download_file(groupName, fileName);
return b;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// @Test
// public void testGetFileInfo(){
// try {
// ClientGlobal.init(conf_filename);
//
// TrackerClient tracker = new TrackerClient();
// TrackerServer trackerServer = tracker.getConnection();
// StorageServer storageServer = null;
//
// StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
// System.out.println(fi.getSourceIpAddr());
// System.out.println(fi.getFileSize());
// System.out.println(fi.getCreateTimestamp());
// System.out.println(fi.getCrc32());
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// @Test
// public void testGetFileMate(){
// try {
// ClientGlobal.init(conf_filename);
//
// TrackerClient tracker = new TrackerClient();
// TrackerServer trackerServer = tracker.getConnection();
// StorageServer storageServer = null;
//
// StorageClient storageClient = new StorageClient(trackerServer,
// storageServer);
// NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
// for(NameValuePair nvp : nvps){
// System.out.println(nvp.getName() + ":" + nvp.getValue());
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/**
* 删除文件
* @param groupName
* @param fileName
* 需要格式:
* groupName:"group1",
* fileName:"M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf"
*/
public static void delete(String groupName,String fileName){
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
int i = storageClient.delete_file(groupName,fileName);
System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("删除异常,"+e.getMessage());
}
}
}
2.6 创建controller接口
上传接口
@RestController
@RequestMapping("/fastdfs")
public class FastdfsController {
@PostMapping("/upload")
public AjaxResult upload(MultipartFile file){
//截取原生文件名的后缀(上传时文件的名的后缀)
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
try {
//上传(需要byte数组和后缀名,达到上传到fastdfs的效果):最终得到的就是上传后他返回的组名+文件名
String upload = FastDfsApiOpr.upload(file.getBytes(), extension);
return AjaxResult.me().setResultObj(upload);//将组名+文件名返回给前台,在通过前台提交把地址保存到数据库
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("上传失败");
}
}
}
3、AjaxResult工具类
//Ajax请求响应对象的类
public class AjaxResult {
private boolean success = true;
private String message = "操作成功!";
//返回到前台对象
private Object resultObj;
public boolean isSuccess() {
return success;
}
public AjaxResult setSuccess(boolean success) {
this.success = success;
return this;
}
public String getMessage() {
return message;
}
public AjaxResult setMessage(String message) {
this.message = message;
return this;
}
public Object getResultObj() {
return resultObj;
}
public AjaxResult setResultObj(Object resultObj) {
this.resultObj = resultObj;
return this;
}
//AjaxResult.me()成功
//AjaxResult.me().setMessage()成功
//AjaxResult.me().setSuccess(false),setMessage("失败");
public static AjaxResult me(){
return new AjaxResult();
}
/*
//成功
public AjaxResult() {
}
//失败并且有提示
public AjaxResult(String message) {
this.success = false;
this.message = message;
}*/
}