FastDFS 使用经验分享
2019独角兽企业重金招聘Python工程师标准>>>
经验一:FastDFS文件下载恢复原始文件名
应用背景
文件被上传到FastDFS后Storage服务端将返回的文件索引(FID),其中文件名是根据FastDFS自定义规则重新生成的,而不是原始文件名,例如: group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk
使用http下载时如不加处理,显示给用户的文件名会是这样的eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk,这样的用户体验很不好。由于FastDFS不会存储原始文件名,也没有提供恢复原始文件名的方法,所以需要应用系统自己想办法恢复原始文件名。
解决方法
通过在项目中多次尝试,找到一种较简单的实现方法,实现过程如下:
一. 应用系统在上传文件到FastDFS成功时将原始文件名和“文件索引(FID)”保存下来(例如:保存到数据库)。
二. 用户点击下载的时用Nginx的域名和FID拼出url,然后在url后面增加一个参数,指定原始文件名。例如:http://121.14.161.48:9030/group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk?attname=filename.apk
三. 在Nginx上进行如下配置,这样Nginx就会截获url中的参数attname,在Http响应头里面加上字段 Content-Disposition “attachment;filename=$arg_attname”。
location /group2/M00 {
root /data/store/data;
if ($arg_attname ~ "^(.*).apk") {add_header Content-Disposition "attachment;filename=$arg_attname";
}
ngx_fastdfs_module;
}
四,浏览器发现响应头里面有Content-Disposition “attachment;filename=$arg_attname”时,就会把文件名显示成filename指定的名称。
完整的请求和响应消息如下:
请求包:
Request URL:http://121.14.161.48:9030/group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk?attname=filename.apk
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Host:121.14.161.48:9030
Referer:http://appandroidpcfront.test.uae.uc.cn/apps
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Query String Parametersview sourceview URL encoded
attname:filename.apk
返回包:
Response Headersview source
Accept-Ranges:bytes
Connection:keep-alive
Content-Disposition:attachment;filename=filename.apk
Content-Length:21821632
Date:Thu, 28 Nov 2013 11:40:46 GMT
Last-Modified:Mon, 18 Nov 2013 02:48:19 GMT
Server:nginx/1.4.3
经验二:从文件的使用技巧
应用背景
使用FastDFS存储一个图片的多个分辨率的备份时,希望只记录源图的FID,并能将其它分辨率的图片与源图关联。可以使用从文件方法。
解决方法
名词注解:主从文件是指文件ID有关联的文件,一个主文件可以对应多个从文件。
主文件ID = 主文件名 + 主文件扩展名
从文件ID = 主文件名 + 从文件后缀名 + 从文件扩展名
以本场景为例:主文件为原始图片,从文件为该图片的一张或多张缩略图。
流程说明:
先上传主文件(即:原文件),得到主文件FID
然后上传从文件(即:缩略图,自己压缩,fastdfs不管),指定主文件FID和从文件后缀名,上传后得到从文件FID。
java伪代码,如下:
public class FastDFSUtils {
private static Logger logger = Logger.getLogger(FastDFSUtils.class);
static{try {ClientGlobal.init("D:/WorkSpace/app-filesystem/conf/fdfs_client.conf");} catch (Exception e) {throw new RuntimeException(e);}
}public static String uploadFile(String filePath) throws Exception{ String fileId = ""; String fileExtName = ""; if (filePath.contains(".")) { fileExtName = filePath.substring(filePath.lastIndexOf(".") + 1); } else { logger.warn("Fail to upload file, because the format of filename is illegal."); return fileId; } //建立连接 /*.......*///上传文件 try { fileId = client.upload_file1(filePath, fileExtName, null); } catch (Exception e) { logger.warn("Upload file \"" + filePath + "\"fails"); }finally{trackerServer.close();} return fileId;
}public static String uploadSlaveFile(String masterFileId, String prefixName, String slaveFilePath) throws Exception{String slaveFileId = ""; String slaveFileExtName = ""; if (slaveFilePath.contains(".")) { slaveFileExtName = slaveFilePath.substring(slaveFilePath.lastIndexOf(".") + 1); } else { logger.warn("Fail to upload file, because the format of filename is illegal."); return slaveFileId; } //建立连接 /*.......*///上传文件 try { slaveFileId = client.upload_file1(masterFileId, prefixName, slaveFilePath, slaveFileExtName, null); } catch (Exception e) { logger.warn("Upload file \"" + slaveFilePath + "\"fails"); }finally{trackerServer.close();}return slaveFileId;
}public static int download(String fileId, String localFile) throws Exception{ int result = 0;//建立连接 TrackerClient tracker = new TrackerClient();TrackerServer trackerServer = tracker.getConnection();StorageServer storageServer = null;StorageClient1 client = new StorageClient1(trackerServer, storageServer); //上传文件 try { result = client.download_file1(fileId, localFile); } catch (Exception e) { logger.warn("Download file \"" + localFile + "\"fails"); }finally{trackerServer.close();}return result;
}public static void main(String[] args) {try {String masterFileId = uploadFile("D:/Tmp/apk/t01134ede0e696735e7.png");System.out.println(masterFileId);download(masterFileId, "D:/Tmp/apk/master.png");String slaveFileId = uploadSlaveFile(masterFileId, "_120x120", "D:/Tmp/apk/PC.png");System.out.println(slaveFileId);download(slaveFileId, "D:/Tmp/apk/slave.png");} catch (Exception e) {logger.error("upload file to FastDFS failed.", e);}}
}
上面代码运行后打印的文件Id为:
主文件:group1/M00/00/00/wKhbylJx1zkIAAAAAAApPcQL87AAAAAAQCmDxUAAClV522.png
从文件:group1/M00/00/00/wKhbylJx1zkIAAAAAAApPcQL87AAAAAAQCmDxUAAClV522_120x120.png
注意:
FastDFS中的主从文件只是在文件ID上有联系。FastDFS server端没有记录主从文件对应关系,因此删除主文件,FastDFS不会自动删除从文件。删除主文件后,从文件的级联删除,需要由应用端来实现。
转载于:https://my.oschina.net/ydsakyclguozi/blog/486470
FastDFS 使用经验分享相关推荐
- 单相计量芯片RN8209D使用经验分享(转)
单相计量芯片RN8209D使用经验分享 转载于:https://www.cnblogs.com/LittleTiger/p/10736060.html
- 录屏软件Kap使用经验分享
录屏软件Kap使用经验分享 Mac OS 系统上的免费又好用的录屏软件Kap 介绍 使用过程 1.下载官网的Kap软件 2.安装 3.设置 4. 录屏 Mac OS 系统上的免费又好用的录屏软件Kap ...
- ghost使用经验分享:限制ghost32的功能的方法
以前我在"ghost使用经验分享--防止菜鸟覆盖已有备份"介绍了用设置文件限制dos版ghost的功能的方法,下面把ghost32的方法也补上. 方法: 1,假定ghost32放在 ...
- 斧子的HTML5输出是什么,CF斧有什么使用技巧 斧子使用经验分享【详解】
很多人知道斧子很牛,但就是用不好,所以好多人练了一段时间就放弃了,其实斧子练习有一些问题是需要注意的,下面就结合一下我个人练习斧子的经验,和大家分享一下,希望能对大家的练习提供一些帮助. 1.拿起斧子 ...
- 技术宅星云的Mac OSX系统使用经验分享
技术宅星云的Mac系统使用经验分享 系统维护 1.1 Mac OSX 卡顿严重 1.2 开启/禁止.DS_store文件生成 1.3 显示/隐藏 系统文件夹 1.4 Mac OSX 开机启动项管理 1 ...
- android nds模拟器窗口,安卓NDS模拟器drastic模拟器使用经验分享
drastic模拟器是一款在安卓平台上的NDS模拟器,让玩家可以在安卓平台中体验NDS游戏,这款模拟器小编感觉还可以,在这里分享一下玩家的使用经验. 新模拟器出来了,过程各种坎坷,就不在这里多累赘了, ...
- 技术分享 | ClickHouse StarRocks 使用经验分享
作者:许天云 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验,主要包含了ClickHouse ...
- sublime前端编辑器入门与个人使用经验分享
Sublime Text(以下简称sublime)是一款很好用的代码编辑器,小巧且很灵敏,几乎可以编写大部分主流的计算机语言代码,更是堪称前端代码编辑神器. 你百度一下会发现许多sublime的安装和 ...
- 迪文DWIN串口屏的使用经验分享
迪文的串口屏,性价比高,质量稳定可靠,屏的种类多,消费类,工业类,医疗.军工.特殊行业等苛刻应用类,各个尺寸均有设计.所以基本能用得上,我分享一下各种屏的使用经验,希望能对大家有帮助. 浅谈迪文屏的发 ...
最新文章
- tomcat远程调试
- 操作系统原理:读写者经典同步问题
- Validation(2)
- 关于SAP Fiori用户管理资料的一个问题
- html加css作品,我的影视作品,如何在博客园发布带有CSS样式的HTML
- python开学吧真假,开学第一课,课课有总结
- 携程赴港二次上市在即 “旅游营销枢纽”战略助价值重估
- WordPress的MySQL宕_wordpress数据库mysql使用phpmyadmin打开数据表,提示table “xxx” doesn`t exist...
- H264/SVC Temporal Scalability
- 对计算机的硬盘进行高级格式化,牛刀初试 高级格式化硬盘完全体验
- 从零开始学习python编程-从零开始学Python程序设计 PDF 完整影印版
- android+获取图库图片+4.4,Android 从 Android 本地图库选择多个图片
- 关于高效找工作的几条建议
- oracle 索引原理
- unity WWW读取StreamingAssets文件
- C++ 仿QQ聊天程序 QQ 聊天室 源码
- 计算机管理老是自动打开,电脑老是自动重启怎么回事怎么解决
- MySQL:让表的时间字段在insert和update时自动更新
- 初步使用bootstrap框架
- facebook头像和昵称_如何将昵称添加到您的Facebook个人资料