FastDFS实现文件上传下载实战
正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一点东西,下面分享一下
一、FastDFS简介:
参见博客:http://blog.csdn.NET/liweizhong193516/article/details/53234486
二、FastDFS使用流程介绍:
我们在itoo的dobbu+zk框架中使用fastdfs+nginx+MySQL实现上传附件的功能,主要原理就是将附件上传到fastdfs得到一个文件的链接路径url,我们获取到这个url将他以字符串形式保存到我们的mysql中,下载的时候获取到这个url直接打开或者下载附件。(url内容参见博客:http://blog.csdn.Net/liweizhong193516/article/details/52556526)
默认的,我们就知道fastdfs后面还有一个nginx服务器,当我们进行存储文件的时候,我们要通过fastdfs给我们生成一个保存地址,也就是grounpID 和保存地址,然后将文件已key-value方式存进nginx服务器中;当我们进行读取文件的时候,我们要通过获取mysql里面的相应文件的存储地址去nginx服务器中通过key,去取出我们的文件进行展示。(所以下载图,有点问题,在这里解释一下)
三、实现流程:
1、配置依赖:因为我们使用的maven来管理工程,所以,我们需要去陪pom文件
- <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.leech</groupId>
- <artifactId>fastdfs-demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>fastdfs-demo</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.csource</groupId>
- <artifactId>fastdfs-client-java</artifactId>
- <version>1.25</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
- </dependencies>
- </project>
当然,更多时候我们利用maven的继承特性,直接配置在父工程中,然后继承下来就o了。
2、新建fdfs_client.conf文件,在我们的itoo中,我们建立在(src/main/resources底下)
- connect_timeout = 2
- network_timeout = 30
- charset = UTF-8
- http.tracker_http_port = 80
- #没什么用
- http.anti_steal_token = no
- http.secret_key = FastDFS1234567890
- tracker_server = 192.168.17.112:22122
- #tracker_server = 192.168.0.119:22122
3、实现文件上传:
- public void save(HttpServletRequest request,HttpServletResponse response){
- String videoName=request.getParameter("videoName");
- String videoType=request.getParameter("videoType");
- String videoDesc=request.getParameter("videoDesc");
- String videoPath=request.getParameter("videoPath");
- String picturePath=request.getParameter("picturePath");
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date uploadTime=null;
- try {
- uploadTime = formatter.parse(formatter.format(new Date()));
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
- String dataBaseName = "itoo_video";
- Video video=new Video();
- video.setUserName("why");
- video.setUserID("why");
- video.setVideoName(videoName);
- video.setVideoPath(videoPath);
- video.setVideoType(videoType);
- video.setVideoDesc(videoDesc);
- video.setDataBaseName(dataBaseName);
- video.setPicturePath(picturePath);
- video.setUploadTime(uploadTime);
- uploadFileService.save(video);
- jackJsonUtil.beanToJson(response,video);
- }
- /*
- * 上传文件
- */
- @RequestMapping(value={"/upload"})
- @ResponseBody
- public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){
- String ext_Name = file.getOriginalFilename().split("\\.")[1];
- String videoName=file.getOriginalFilename().split("\\.")[0];
- byte[] bytes = null;
- try {
- bytes = file.getBytes();
- } catch (IOException e) {
- e.printStackTrace();
- }
- String videoPath=uploadFile(bytes,ext_Name);
- JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
- Video video=new Video();
- video.setVideoPath(videoPath);
- video.setVideoName(videoName);
- jackJsonUtil.beanToJson(response,video);
- }
- public String uploadFile(byte[] byteFile, String ext_file) {
- // 拼接服务区的文件路径
- StringBuffer sbPath = new StringBuffer();
- sbPath.append("http://192.168.22.252");
- try {
- // 初始化文件资源
- ClientGlobal
- .init("C:\\Users\\alsr\\Desktop\\ITOO-5.0\\itoo-video-Test\\dmsd-itoo-video-parent\\dmsd-itoo-video-web\\src\\main\\resources\\fdfs_client.conf");
- // 链接FastDFS服务器,创建tracker和Stroage
- TrackerClient trackerClient = new TrackerClient();
- TrackerServer trackerServer = trackerClient.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer,
- storageServer);
- //利用字节流上传文件
- String[] strings = storageClient.upload_file(byteFile, ext_file, null);
- for (String string : strings) {
- sbPath.append("/" + string);
- System.out.println(string);
- }
- // 全路径
- System.out.println(sbPath);
- } catch (IOException | MyException e) {
- e.printStackTrace();
- }
- return sbPath.toString();
- }
只要我们能正常接收到一个json类型的字符串(url地址),就证明我们已经上传成功了,如果不信,可以直接用浏览器去验证一下,看看能不能得到文件展示。
4、FastDFS实现文件下载:
- public void testDownload() {
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer, storageServer);
- byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- System.out.println(b);
- IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
5、FastDFS获取将上传文件信息:
- 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();
- }
- }
6、FastDFS获取文件名称:
- 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();
- }
- }
7、FastDFS实现删除文件:
- public void testDelete(){
- try {
- ClientGlobal.init(conf_filename);
- TrackerClient tracker = new TrackerClient();
- TrackerServer trackerServer = tracker.getConnection();
- StorageServer storageServer = null;
- StorageClient storageClient = new StorageClient(trackerServer,storageServer);
- int i = storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
- System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
FastDFS实现文件上传下载实战的更多相关文章
- Java 客户端操作 FastDFS 实现文件上传下载替换删除
FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...
- SpringMVC整合fastdfs-client-java实现web文件上传下载
原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
- 一、手把手教你docker搭建fastDFS文件上传下载服务器
在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
随机推荐
- html表单样式, table隔行高亮, 长字符串自动换行
2016年1月14日 11:16:54 星期四 效果图: html: <!DOCTYPE html> <html lang="en"> <head&g ...
- ffmpeg-20160726-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- LINUX查看系统日志
cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安 ...
- 【C语言】pragma
① #pragma comment (lib, "libgsl.a") 这是告诉编译器在编译形成的.obj文件和.exe文件中加一条信息,使得 链接器在链接库的时候要去找libgs ...
- 【Git】标签管理
来源:廖雪峰 为什么要标签: 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来. ...
- 【Git】笔记2
来源:廖雪峰 安装git(ubuntu) sudo apt-get install git 创建版本库(repository) 在想生成版本库的文件夹下输入: git init 指定用户名和邮箱 g ...
- 【python】利用pathlib遍历目录Path().rglob
来源:https://docs.python.org/3/library/pathlib.html 可以用pathlib模块中的Path().rglob来递归遍历文件 from pathlib imp ...
- codeforces gym 100286 I iSharp (字符串模拟)
题目链接 给定一个字符串.输入是int& a*[]&, b, c*; 输出是 int&&[]* a;int& b;int&* c; 输入格式里逗号后面一 ...
- os.walk()
os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. walk()方法语法格式如下: os.walk(top[, topdown=True[, onerror=None[ ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...