- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章FasfDFS整合Java实现文件上传下载功能实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下.
今天使用Java代码实现文件的上传和下载。对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中。或者在Maven项目pom.xml文件中添加依赖 。
1
2
3
4
5
|
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>
1.27
-SNAPSHOT</version>
</dependency>
|
一 : 添加配置文件 。
当完成以上操作之后可以添加链接FastDFS服务器的配置文件 fastdfs-client.properties 。
1
2
3
4
5
6
7
|
fastdfs.connect_timeout_in_seconds =
5
fastdfs.network_timeout_in_seconds =
30
fastdfs.charset = UTF-
8
fastdfs.http_anti_steal_token =
false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port =
80
fastdfs.tracker_servers =
192.168
.
1.7
:
22122
|
因为项目中只使用properties 格式文件,如果需要更多的配置信息,可以查看官方的配置信息 。
注: 1. 其他的配置项为可选,fastdfs.tracker_servers 为必须选项 。
2. 多个tracker_servers可以使用逗号“ , ”分隔 。
二 : 加载配置文件 。
1. 测试加载配置文件 。
1
2
3
4
5
6
|
@Test
public
void
initConifg()
throws
Exception {
// 加载配置文件
ClientGlobal.initByProperties(
"config/fastdfs-client.properties"
);
System.out.println(
"ClientGlobal.configInfo():"
+ ClientGlobal.configInfo());
}
|
2. 输出结果 。
1
2
3
4
5
6
7
8
9
|
ClientGlobal.configInfo():{
g_connect_timeout(ms) =
5000
g_network_timeout(ms) =
30000
g_charset = UTF-
8
g_anti_steal_token =
false
g_secret_key = FastDFS1234567890
g_tracker_http_port =
80
trackerServers =
192.168
.
1.7
:
22122
}
|
当出现上面和配置文件一致的输出结果时候,说明加载配置文件已经成功.
三:功能实现 。
由于是使用Junit做测试,为了方便在开始执行之前,初始化配置文件和获取连接,同时没有捕获异常全部抛出 。
1.初始化连接信息 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//成员变量
TrackerServer trackerServer =
null
;
StorageServer storageServer =
null
;
StorageClient storageClient =
null
;
/**
* 初始化连接信息
* @author: wrh45
* @date: 2017年8月5日下午8:08:57
*/
@Before
public
void
init()
throws
Exception {
// 加载配置文件
ClientGlobal.initByProperties(
"config/fastdfs-client.properties"
);
// 获取连接
TrackerClient trackerClient =
new
TrackerClient();
trackerServer = trackerClient.getConnection();
storageClient =
new
StorageClient(trackerServer, storageServer);
}
|
注: 如果出现连接超时异常:java.net.SocketTimeoutException: connect timed out 。
1 .查看服务器地址和端口是否正确 。
2 .请查看服务器TrackerServer和StorageServer服务端口是否开启。默认为22122和23000 。
2.上传文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/**
* 上传图片
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午7:09:23
*/
@Test
public
void
uploadFileOfByte()
throws
Exception {
// 获取文件字节信息
file =
new
File(
"src/test/resources/pic/Ace.jpg"
);
FileInputStream inputStream =
new
FileInputStream(file);
byte
[] file_buff =
new
byte
[(
int
) file.length()];
inputStream.read(file_buff);
// 获取文件扩展名
String fileName = file.getName();
String extName =
null
;
if
(fileName.contains(
"."
)) {
extName = fileName.substring(fileName.lastIndexOf(
"."
) +
1
);
}
else
{
return
;
}
// 图片元数据,如果设置为空,那么服务器上不会生成-m的原数据文件
NameValuePair[] meta_list =
new
NameValuePair[
2
];
meta_list[
0
] =
new
NameValuePair(
"fileName"
,
"测试专用"
);
meta_list[
1
] =
new
NameValuePair(
"length"
,
"测试专用"
);
// 文件上传,返回组名和访问地址
String[] upload_file = storageClient.upload_file(file_buff, extName, meta_list);
System.out.println(Arrays.asList(upload_file));
}
|
下面是执行结果 。
已经将图片上传到服务器,同时返回了图片地址。那么通过这个地址试试能否访问 。
OK,在浏览器输入地址后,成功返回了图片信息 。
3.下载文件 。
这里通过storageClient下载文件,然后将数据存储到本地。如果通过浏览器下载,同理将数据写入文件即可 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**
* 下载图片
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午8:09:10
*/
@Test
public
void
downLoadFile()
throws
Exception {
// 下载文件,返回字节数组
byte
[] file_buff = storageClient.download_file(
"group1"
,
"M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg"
);
// 将数据写文件中
File file =
new
File(
"src/test/resources/pic/Ace2.jpg"
);
FileOutputStream outStream =
new
FileOutputStream(file);
outStream.write(file_buff);
outStream.flush();
outStream.close();
}
|
下面是执行结果,不出意外是可以成功执行的 。
4.获取元数据信息 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 元数据信息
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午8:09:38
*/
@Test
public
void
metaData()
throws
Exception {
// 上传图片的时候,元数据若为空将无法生存-m的原数据文件。获取时候此处将抛出NullPointerException
NameValuePair[] get_metadata = storageClient.get_metadata(
"group1"
,
"M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg"
);
for
(NameValuePair nameValuePair: get_metadata) {
System.out.println(
"name: "
+ nameValuePair.getName() +
" value: "
+ nameValuePair.getValue());
}
}
|
以下是执行结果,获取到的数据和上传的数据一样 。
name: fileName value: 测试专用 name: length value: 测试专用 。
5.获取文件信息 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* 获取文件信息
* @author: wrh45
* @date: 2017年8月7日下午9:02:47
*/
@Test
public
void
getFileInfo()
throws
Exception {
FileInfo fileInfo = storageClient.get_file_info(
"group1"
,
"M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg"
);
System.out.println(
"CRC32签名:"
+ fileInfo.getCrc32());
System.out.println(
"文件大小:"
+ fileInfo.getFileSize());
System.out.println(
"服务器地址:"
+ fileInfo.getSourceIpAddr());
System.out.println(
"创建时间:"
+
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
).format(fileInfo.getCreateTimestamp()));
}
|
输出结果 。
CRC32签名:-1995498431 文件大小:369781 服务器地址:192.168.1.7 创建时间:2017-08-07 20-24-56 。
6.删除文件 。
当数据测试完整之后,试试能否删除吧 。
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* 删除文件
* @throws Exception
* @author: wrh45
* @date: 2017年8月7日下午9:10:04
*/
@Test
public
void
deleteFile()
throws
Exception {
// 返回0成功,否则返回错误吗
int
code = storageClient.delete_file(
"group1"
,
"M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg"
);
System.out.println(code);
}
|
删除之后输出结果为0,如果出现非0结果,那么返回的是错误代码 。
以上是Java实现上传下载等功能的代码,如果需要可以封装成工具类使用.
以下是个人封装好的工具类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
/**
* 上传文件工具类
* @ClassName: FileUploadUtils
* @author wrh45
* @date 2017年8月8日下午4:14:31
*/
public
class
FileUploadUtils {
private
static
TrackerClient trackerClient =
null
;
private
static
TrackerServer trackerServer =
null
;
private
static
StorageServer storageServer =
null
;
private
static
StorageClient storageClient =
null
;
private
static
final
String groupName =
"group1"
;
static
{
// 加载配置文件
try
{
ClientGlobal.initByProperties(
"config/fastdfs-client.properties"
);
// System.out.println("ClientGlobal.configInfo():" +
// ClientGlobal.configInfo());
}
catch
(IOException | MyException e) {
e.printStackTrace();
System.out.println(
"load config file fail"
);
}
}
/*
* 初始化连接数据
*/
private static void init() {
try {
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageClient = new StorageClient(trackerServer, storageServer);
} catch (IOException e) {
e.printStackTrace();
System.out.println("init fail");
}
}
/**
* 上传文件
* @param filePath 文件路径
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午11:10:38
*/
public static String[] uploadFile(String filePath, String fileName) {
return uploadFile(null, filePath, fileName);
}
/**
* 上传文件
* @param fileBuff 文件字节数组
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午11:10:38
*/
public static String[] uploadFile(byte[] fileBuff, String fileName) {
return uploadFile(fileBuff, null, fileName);
}
/**
* 上传文件
* @param file_buff 文件字节数组
* @param filePath 文件路径
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午10:58:19
*/
private static String[] uploadFile(byte[] fileBuff, String filePath, String fileName) {
try {
if (fileBuff == null && filePath == null) {
return new String[0];
}
// 初始化数据
if (storageClient == null) {
init();
}
// 获取文件扩展名称
String fileExtName = "";
if (fileName != null && !"".equals(fileName) && fileName.contains(".")) {
fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);
} else {
return new String[0];
}
// 设置图片元数据
NameValuePair[] metaList = new NameValuePair[3];
metaList[0] = new NameValuePair("fileName", fileName);
metaList[1] = new NameValuePair("fileExtName", fileExtName);
metaList[2] = new NameValuePair("fileSize", String.valueOf(fileBuff.length));
// 上传文件
String[] uploadFile = null;
if (fileBuff != null && filePath == null) {
if (fileBuff.length == 0) {
return new String[0];
}
uploadFile = storageClient.upload_file(fileBuff, fileExtName, metaList);
} else {
//路径匹配Windown和Linux
if ("".equals(filePath) || !(filePath.matches("^[a-zA-Z]:{1}([\u4e00-\u9fa5\\w/_\\\\-]+)$") || filePath.matches("^(/[\u4e00-\u9fa5\\w_-]+)+$"))) {
return new String[0];
}
uploadFile = storageClient.upload_file(filePath, fileExtName, metaList);
}
return uploadFile == null ? new String[0] : uploadFile;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (trackerServer != null) {
trackerServer.close();
trackerServer = null;
}
if (storageServer != null) {
storageServer.close();
storageServer = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return new String[0];
}
/**
* 删除服务器文件
* @param remoteFileName 文件在服务器中名称
* @author: wrh45
* @date: 2017年8月6日上午12:15:22
*/
public static int deleteFile(String remoteFileName) {
try {
if (remoteFileName == null || "".equals(remoteFileName) || !remoteFileName.contains(groupName)) {
return -1;
}
if (storageClient == null) {
init();
}
String fileURL = remoteFileName.substring(remoteFileName.indexOf(groupName));
String group = fileURL.substring(0, remoteFileName.indexOf("/") + 1);
String fileName = fileURL.substring(remoteFileName.indexOf("/") + 2);
int code = storageClient.delete_file(group, fileName);
return code;
} catch (Exception e) {
e.printStackTrace();
System.out.println("The File Delete Fail");
}
return -1;
}
/**
* 获取文件信息
* @param groupName 组名
* @param remoteFilename 远程文件名
* @return
* @author: wrh45
* @date: 2017年8月8日上午12:25:26
*/
public
static
FileInfo getFileInfo(String groupName, String remoteFilename) {
try
{
if
(storageClient ==
null
) {
init();
}
FileInfo fileInfo = storageClient.get_file_info(groupName, remoteFilename);
return
fileInfo;
}
catch
(Exception e) {
e.printStackTrace();
System.out.println(
"Get File Info Fail"
);
}
return
null
;
}
}
|
总结 。
以上所述是小编给大家介绍的FasfDFS整合Java实现文件上传下载功能实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://www.cnblogs.com/immortal-ghost/p/7300185.html 。
最后此篇关于FasfDFS整合Java实现文件上传下载功能实例详解的文章就讲到这里了,如果你想了解更多关于FasfDFS整合Java实现文件上传下载功能实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!