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 = 主文件名 + 从文件后缀名 + 从文件扩展名

以本场景为例:主文件为原始图片,从文件为该图片的一张或多张缩略图。

流程说明:

  1. 先上传主文件(即:原文件),得到主文件FID

  2. 然后上传从文件(即:缩略图,自己压缩,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 使用经验分享相关推荐

  1. 单相计量芯片RN8209D使用经验分享(转)

    单相计量芯片RN8209D使用经验分享 转载于:https://www.cnblogs.com/LittleTiger/p/10736060.html

  2. 录屏软件Kap使用经验分享

    录屏软件Kap使用经验分享 Mac OS 系统上的免费又好用的录屏软件Kap 介绍 使用过程 1.下载官网的Kap软件 2.安装 3.设置 4. 录屏 Mac OS 系统上的免费又好用的录屏软件Kap ...

  3. ghost使用经验分享:限制ghost32的功能的方法

    以前我在"ghost使用经验分享--防止菜鸟覆盖已有备份"介绍了用设置文件限制dos版ghost的功能的方法,下面把ghost32的方法也补上. 方法: 1,假定ghost32放在 ...

  4. 斧子的HTML5输出是什么,CF斧有什么使用技巧 斧子使用经验分享【详解】

    很多人知道斧子很牛,但就是用不好,所以好多人练了一段时间就放弃了,其实斧子练习有一些问题是需要注意的,下面就结合一下我个人练习斧子的经验,和大家分享一下,希望能对大家的练习提供一些帮助. 1.拿起斧子 ...

  5. 技术宅星云的Mac OSX系统使用经验分享

    技术宅星云的Mac系统使用经验分享 系统维护 1.1 Mac OSX 卡顿严重 1.2 开启/禁止.DS_store文件生成 1.3 显示/隐藏 系统文件夹 1.4 Mac OSX 开机启动项管理 1 ...

  6. android nds模拟器窗口,安卓NDS模拟器drastic模拟器使用经验分享

    drastic模拟器是一款在安卓平台上的NDS模拟器,让玩家可以在安卓平台中体验NDS游戏,这款模拟器小编感觉还可以,在这里分享一下玩家的使用经验. 新模拟器出来了,过程各种坎坷,就不在这里多累赘了, ...

  7. 技术分享 | ClickHouse StarRocks 使用经验分享

    作者:许天云 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一. 大纲 本篇分享下个人在实时数仓方向的一些使用经验,主要包含了ClickHouse ...

  8. sublime前端编辑器入门与个人使用经验分享

    Sublime Text(以下简称sublime)是一款很好用的代码编辑器,小巧且很灵敏,几乎可以编写大部分主流的计算机语言代码,更是堪称前端代码编辑神器. 你百度一下会发现许多sublime的安装和 ...

  9. 迪文DWIN串口屏的使用经验分享

    迪文的串口屏,性价比高,质量稳定可靠,屏的种类多,消费类,工业类,医疗.军工.特殊行业等苛刻应用类,各个尺寸均有设计.所以基本能用得上,我分享一下各种屏的使用经验,希望能对大家有帮助. 浅谈迪文屏的发 ...

最新文章

  1. tomcat远程调试
  2. 操作系统原理:读写者经典同步问题
  3. Validation(2)
  4. 关于SAP Fiori用户管理资料的一个问题
  5. html加css作品,我的影视作品,如何在博客园发布带有CSS样式的HTML
  6. python开学吧真假,开学第一课,课课有总结
  7. 携程赴港二次上市在即 “旅游营销枢纽”战略助价值重估
  8. WordPress的MySQL宕_wordpress数据库mysql使用phpmyadmin打开数据表,提示table “xxx” doesn`t exist...
  9. H264/SVC Temporal Scalability
  10. 对计算机的硬盘进行高级格式化,牛刀初试 高级格式化硬盘完全体验
  11. 从零开始学习python编程-从零开始学Python程序设计 PDF 完整影印版
  12. android+获取图库图片+4.4,Android 从 Android 本地图库选择多个图片
  13. 关于高效找工作的几条建议
  14. oracle 索引原理
  15. unity WWW读取StreamingAssets文件
  16. C++ 仿QQ聊天程序 QQ 聊天室 源码
  17. 计算机管理老是自动打开,电脑老是自动重启怎么回事怎么解决
  18. MySQL:让表的时间字段在insert和update时自动更新
  19. 初步使用bootstrap框架
  20. facebook头像和昵称_如何将昵称添加到您的Facebook个人资料

热门文章

  1. 【赠书】21世纪科技竞争的核心是超级智能的控制权
  2. 《科学美国人》评出2019年十大突破性技术
  3. 详解|清华大学100页PPT:工业机器人技术详解
  4. 当 AI 开始“入侵”人类
  5. 唯一聚集索引上的唯一和非唯一非聚集索引
  6. c++版a+b问题的各种无聊做法
  7. Python 小程序(2)
  8. java虚拟机(二)
  9. python-虎扑爬虫
  10. AI大军又添猛将:海云数据宣布“双亿元AI扶持计划”