Thursday, April 30, 2020

一个百家姓天团,打开品牌合作新大门

一个百家姓天团,打开品牌合作新大门


 短视频,自媒体,达人种草一站服务

有人说:一个气质不凡的名字会影响品牌一生。不过你仔细观察,会发现众多本土牌都默默遵循着相似的起名“套路”。

比如,有自带节奏的叠词系:钉钉、当当、滴滴;有BAT领衔的世界动物园:天猫、途牛、酷狗;还有集齐一套可以词语接龙的美妆玄学派:欧珀莱、珀莱雅、雅诗兰黛……

这些名字相似的小伙伴,或因天生亲切感,总能更好地玩在一起。这不,烧脑君近期发现,一组名字带着百家姓氏的品牌——雀氏、亨氏、英氏、爱氏晨曦、家乐氏、威露士、玛氏箭牌彩虹糖 不约而同齐聚一堂,组团干了件引人注目的大事。

上周,赶上全民Pick《青春有你2》《创造营2020》的热潮,它们拉出半个品牌圈的资源,以“品牌百家姓”自居,正式成团出道。

所谓成年人的世界,难字当头;2020的魔幻开篇,又让我们的生活更显难上加难。微博上,#日常丧#的话题不断被网友翻牌。面对全民情绪告急,本次,这7位伙伴决定以团之名给大家加油打气,释放满满正能量,帮大家重拾小确幸。

4月21日,雀氏官博率先发布悬念海报,以拟人化口吻预告“品牌百家姓”组团集结中,难掩内心小紧张、小激动、小兴奋。

从海报剪影,我们很难预测本次团员都有谁。但下方“超能打”“超能量”“超正气”三个关键词,提前透露了团队人设。这将是一支年轻有活力的偶像天团,关于他们会以怎样的方式给大家加油打气,各路网友纷纷表示既好奇又期待。

官博评论下,雀氏一一回应每位粉丝的热情

隔天,7大品牌正式官宣出道。它们从各自优势出发,发布单人海报,高喊打气宣言。

宣言里,押韵梗、谐音梗……团员们信手拈来。它们对宝妈日常在意的方方面面做出正向承诺。而海报本身流畅、灵动的简笔画风附着暖色背景,又在无形中给人以力量和信赖感。

为进一步强化这种感觉,它们还联动60+微博蓝v、百位红人、4位抖音大咖等一众KOL强势打Call,邀大家参与互动,吸引更多路人火速围观。

微博上,围绕话题#给2020年的自己打个气#,KOL统一口径助力打气天团

抖音上,博主们从各自角度出发上演小剧场,宣推品牌正能量

宠粉雀氏,更是超有心的定制“2020限量款加油打气包”作为派发福利,赠送应援粉丝。

最终,品牌顺利成团走花路,将自家好货放置到京东上,合力打造京东超市“周五购疯狂”跨品类专场,以福利周边、优惠折扣回馈消费者。粉丝们开心追随,在感受品牌正能量的同时被引导进入购物平台“元气补给站”,不仅拥有了一次开心买买买的购物体验,还能收获实惠好物给生活增添的幸福感。

当下,在Co-Branding范畴,很多品牌习惯牵手意想不到的跨界对象。

反观这7个受众群相近、所属品类相似、营销目标一致、甚至连品牌命名都高度契合的品牌,却让我们看到了品牌合作的另一种可能。它们以实际行动证明,从洞察国民情绪出发,和调性相似的品牌组合起来,也能碰撞出不一样的火花;只要站在受众角度去真诚沟通,没有惊喜联名款也能让品牌联合更富感染力。

最后,引用这次品牌百家姓联合的活动口号——“春日不等待,加油趁现在!”。

烧脑君想对你说:千万别丧!加油生活,加油工作!在这个追求差异化营销的时代里,除了让人意想不到的“异业”跨界,玩转出品牌多维度共性的“同业”组团,也不失为一种新颖的营销尝试。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!


从二审,视频审核到公司营业执照经营范围审查,亚马逊在释放某些信号!

4月26日,亚马逊公布了正在对第三方卖家进行视频审核的消息。该程序目前正在美国、英国、中国和日本等国家进行试点,据悉有超过1000名卖家通过了审核。

针对此计划,亚马逊在接受媒体采访时披露了更多细节内容。从今年年初开始,亚马逊就一直在悄悄进行第三方卖家的严格审核程序,通过视频通话的方式来补充验证卖家在线提交审核流程的真实性,验证申请人的身份。

其实,在2019年2月份的时候,亚马逊就在实验另外一种视频审核的方式,是通过录制面部视频的方式验证卖家身份程序。

根据报道,当时测试的范围未涉及到中国卖家。最先被要求通过录制视频方式进行验证的消息来自于一位越南的亚马逊卖家,他在2019年1月份注册卖家资料时被提示使用计算机的网络摄像头拍摄五秒钟面部视频。

卖家验证提示中显示:我们将记录您5秒钟的面部视频,该视频将被加密并存储以用于识别。要继续,请启用对网络摄像头的访问权限。

但在这次的视频审核计划中,亚马逊否认了使用面部识别技术进行身份验证的说法。live verification试点计划主要是检查卖家的ID是否与系统中已存的文件资料相匹配,他们会与卖家一对一联系。

亚马逊表示,其针对第三方卖家的现有验证流程结合了机器人学习和人工审核功能,通过数百个数据点来识别卖家账户信息,包括验证该账户是否与之前亚马逊删除的某个账户相关。而且在审核通过之前,还要经过培训的审核员对卖家的申请进行审查。据称,这些程序曾在2019年帮助亚马逊监测封停了250万个违规的卖家账户。

根据亚马逊的说法,live verification计划的目的是为了控制平台的欺诈手段:假冒产品,虚假评论等等。

其实在这之前亚马逊也是做了一些努力的,不论是零项目计划还是透明计划。

去年,亚马逊启动了"零项目"计划(Project Zero),推出了一系列工具供品牌商使用。品牌商可以选择向亚马逊提供自己的logo、商标和其他关键数据,让零售商能够扫描其数十亿的产品列表,更主动地发现可疑的假冒产品。

另一个计划,亚马逊的透明计划,允许品牌在生产过程中在产品上加上一个独特的代码,以后可以通过扫描验证购买的产品真伪。这个工具在去年夏天被应用到了包括欧洲、加拿大和印度在内的市场。

当然,live verification计划在另外一个方面的意义也是在监控卖家的多账户问题,更进一步讲就是亚马逊越来越看重卖家的规范性,是否合规问题。我们分三个方面。

通常,亚马逊检测到卖家可能拥有第二个账户的信息包括多个方面,亚马逊的审查系统一旦监测到其中的某些信息存在一致,更甚者同样的IP登录会直接关闭账号。

•设备ID

•IP地址

•信用卡

•银行账户

•公司名称

•账单或发货地址

•电话号码

第二点,亚马逊的二次审核。亚马逊从2019年下半年开始加大对新卖家的审核力度,据说亚马逊在最初进行二审账户审核时,卖家的注册通过率不足5%。

二次审核主要是针对资料存疑、规范存疑的店铺的进一步审核。这其中比较重点的就是亚马逊会着重审核卖家的地址问题。这一点从亚马逊要求提供的二审资料中就可以看出,审核通过的关键点是提交审核的资料上的信息是否与在亚马逊后台备案的地址一致。亚马逊更看重卖家是否在实际运营该公司,而不仅仅是注册一个空壳公司仅仅用来注册亚马逊店铺。

第三点,平台销售产品与注册公司营业范围不一致问题。这一问题目前主要集中在欧洲站,防疫用品相关的卖家。

有欧洲站的卖家收到亚马逊的邮件:

1168.png

根据邮件中显示,如果卖家无法按照亚马逊要求提供对应的信息,亚马逊将会冻结卖家账户资金,关闭账户。

对于这一次亚马逊的动作,这其中牵扯了大环境之下社会关注的问题,我们也可以理解为这是在非常时期亚马逊不得已做出的应急措施,但是亚马逊对于卖家的监控和打击从未停止脚步。

相信一系列的动作会在下半年表现的更为明显,想要长久在亚马逊平台上做生意的卖家提前准备,规范化运营。

来源:观海论商


文章来源:https://www.ikjzd.com/home/120934

咳嗽老不好,或许是你用错药:2类中药,你用对了吗?

咳嗽老不好,或许是你用错药:2类中药,你用对了吗?


每年入冬,人群聚集的地方就成了咳嗽交响乐响起的地方。每天上班时候都可以听到很多人在咳嗽。有的人咳嗽的厉害了,甚至会引发其它的炎症,给身体带来极大负担。那么秋冬经常咳嗽感冒,是什么引起的呢?它和其他季节发生的感冒是否一样?我们应该如何预防或者治疗呢?

秋冬经常咳嗽,可能是"燥"的锅

民间有一种说法:秋冬养肺。肺喜"润"而厌"燥",如果肺部因为天气影响而得不到滋润,则会让人咳嗽不断。那么秋冬到底有多"燥"?皮肤、喉咙、嘴巴、眼睛相信是最有权利发言的。而在中医眼里:"温邪上受,首先犯肺",肺就像一座钟,罩在五脏之上。一旦保护不好,受到燥邪入侵,便会咚咚咚地响,就像一个人在咳嗽一样。所以秋冬干燥季节来临,人体内的津液会随之减少,如果不注意养生,肺部长期津液不足,得不到滋润,则会让肺部产生问题,咳嗽不断。

要治咳嗽,先分寒、热

咳嗽也是分很多种类型,不同的疾病都会引起咳嗽症状。我们要治咳嗽,就先要分清楚引起咳嗽的病因。

一种是"寒咳"。这是由于人体受到风寒袭击而导致"肺气不宣"引发的咳嗽,一般表现为:喉咙干痒,鼻塞不畅,咳嗽时声音浑浊,并且伴有白痰,头痛难耐,鼻涕不止等。

另一种则是"热咳"。它是因为身体受到风热之邪而引发肺部积郁热气,引发咳嗽。热咳一般声音比较清脆,咳痰也是呈现黄色。咽喉甚至全身都有肿痛现象,并伴有身体发热发汗等。

两种咳嗽病因不同,在治疗的时候也要注意区分:寒咳以疏散风寒气为主,而热咳则要疏风清热。共同点是两者都要宣肺止咳。

频繁咳嗽,两种病因有两种治疗方法

引发咳嗽的病因了解清楚以后,我们就可以具体看看两种咳嗽的治疗方法。

寒咳治疗,重点是"解表散寒"。解表散寒是中医术语,简单来说,就是打开皮肤毛孔,将体内导致疾病的寒气散出去,达到治疗外感风寒引发的病症的效果。

常见的可以到达解表散寒目的的中药有:紫苏叶、羌活等。《本草纲目》记载,紫苏叶有"解表散寒、行气和胃"的功效,其解热作用十分显著。对于风寒引发的咳嗽、呕吐,都有奇效。羌活则可以祛风除湿止痛,可以解决风寒引发的咳嗽、酸痛等问题。

可以推荐的中成药有"通宣理肺丸",其成分中就包含紫苏叶、苦杏仁、麻黄等。食疗的话,则可以推荐大家用萝卜、生姜还有葱白煮汤,可以有效缓解寒咳引起的咳嗽。

热咳的治疗则是以"疏散风热,宣肺止咳"为主。可以使用的中药材较多,诸如:谷精草、蔓荆子、木贼、牛蒡子和桑叶等等。《开宝本草》:"谷精草主疗喉痹,齿风痛,及诸疮疥。"它能祛风散热,用于风热感冒,头痛昏胀有很好的效果。《中草药手册》记载,蔓荆子能疏散风热,清利头目,主治外感风热,头昏头痛,偏头痛。

可以服用的中成药则是"桑菊感冒片",成分有薄荷、桑叶、连翘等。此外,我们也可以熬制一些冰糖雪梨汤来缓解咳嗽。

治秋冬咳嗽,得慎用2类药:

在了解了寒咳和热咳的相关知识后,大家也应该注意,治疗秋冬咳嗽,不可随意乱用药。

首先,广西南宁市人民医院主任医师李艳鸣提醒大家,治疗秋冬季咳嗽,需要慎用包括苦寒泻火药在内的药物。另外,咳嗽患者也应该注意休息,以免睡眠不足导致免疫力下降,让感冒更加严重。

其次,对于风寒引发的寒咳,不能乱用收敛镇咳药,因为这种药物会让肺气积郁,严重者会导致慢性咳嗽,更难以治愈。

而热咳就要避免辛辣油腻的食品,以免体内的热气散不出去,影响脾胃功能,加重病情。

大家在预防疾病防治咳嗽时,也应该注意,只有均衡饮食、保持锻炼,才能提高身体免疫力,避免疾病找上身。

参考资料:

[1] 李艳鸣. 秋冬咳嗽,慎用三种药. 上海中医药报,2012-10-26(003)

[2] 秋冬季节外感咳嗽证型分布研究.南京中医药大学 2011-06-01

[3] 秋冬咳嗽高发 选药有讲究.中国药店 2010-12-15

未经作者允许授权,禁止转载

请输入图片地址

扫描以上二维码,关注【39健康网】公众号,回复您遇到的健康问题,即有专家为您免费解答。


Android 开发技术周报 Issue#277

Android 开发技术周报 Issue#277


📰新闻

  1. Android 11界面再调整:加入快速截屏、多任务向国产ROM看齐

  2. 最新版Android 11推送 谷歌Pixel 5被曝光:支持反向充电

  3. 4月Android系统版本分布:8.0 Oreo最主流

  4. [图]Play商城新规让订阅更透明:试用期结束/续订会通知用户

  5. Google 强制要求 Android 11 支持"无缝更新"

📖教程

  1. 是时候迁移至 AndroidX 了!

  2. 了解一下,Android 10 中的ART虚拟机(5

  3. 在 Android 开发中使用协程 | 上手指南

  4. Kotlin Vocabulary | 类型别名 typealias

  5. 我感觉我学了一个假的 Android...

👖开源库

  1. viewpagerdots

    This library provides a very small, compact, Kotlin-based implementation for ViewPager dots. The dots can of course be switched out for whatever type of Drawable you wish. The animation can be customized as well.

  2. open-upi

    An Android SDK for server-less UPI payments with minimum configuration

  3. control

    coroutines flow based uni-directional architecture

  4. LiveData-Extensions

    Write beautifully concise and clean code for complex LiveData transformations in Android.

  5. ZoomPreviewPicture

    拓展性极高类似微信图片和视频浏览,常见应用场景如微信朋友圈照片九宫格和微信聊天图片图片,视频,gif预览

  6. RxLife-Coroutine

    自动管理协程生命周期,并自动捕获异常

  7. apollo-android

    📟 A strongly-typed, caching GraphQL client for Android and the JVM

  8. MVVM Android

    VVM Android is the framework based on Android Architecture components, which gives you set of base classes to implement concise, testable and solid application. It combines built-in support for Dagger 2 dependency injection, View DataBinding, ViewModel and RxJava use cases. Architecture described here is used among wide variety of projects and it's production ready.

  9. ScreenOrientationHelper

    Screen orientation event listener helper for activity in Android

  10. andColorPicker

    🥑 Handy, 🐍 flexible and ⚡️ lightning-fast material android color picker view components

  11. LakuePagingButton

    LakuePagingButton make it easy to page through when loading a lot of data.

  12. sectioned-recycler-view

    A library that allows using sections with sticky headers in RecyclerView.

  13. licenseview

    A custom View for displaying licenses conveniently.

  14. RNetwork

    A light weight and lifecycle awared live connection status library using reactivenetwork and crouton.

  15. venom

    A lightweight tool that simplifies testing of the process death scenario.

  16. TvWidget

    tv常用效果控件,包括焦点、边框处理等。

  17. zxing-android-embedded

    Barcode scanner library for Android, based on the ZXing decoder

  18. ChartView

    一组针对统计图的自定义控件,高度定制化;折线图统计图提供了各项属性供用户定制,且带手势操作,有点像股票实线图。饼状统计图,同样提供了大量属性定制,可随意更改初始角度,添加item后会自动计算概率等等

  19. punkt

    A live coding music library/environment for Kotlin. For software developers who want to dive into live coding music.

  20. Android-SnapTimePicker

    Another Material Time Picker for developer who do not like default Material Time Picker that difficult to use for most users

  21. DatePickerTimeline

    An android package that provides a Horizontal Date Picker.

  22. Tangram-Android

    a modular UI solution for building native page dynamically including Tangram for Android, Tangram for iOS and even backend CMS. This project provides the sdk on Android.

模版

  1. kotlin-android-template

    Android + Kotlin + Github Actions + ktlint + Detekt + Gradle Kotlin DSL + buildSrc = ❤️,A simple Github template that lets you create an Android/Kotlin project and be up and running in a few seconds.

🍴插件

  1. danger-kotlin-android-lint-plugin

    Show the Android lint errors with Danger

  2. gradle-sourcegen-plugin

    A Plugin that configures directory for generated sources

  3. android-analyzer

    Android Gradle plugin for faster Sonarqube integration in Android projects. Supports Detekt and Jacoco out of the box.

🌰示例

  1. Kotlin-Coroutine-Use-Cases-on-Android

    🎓 Learning Kotlin Coroutines for Android by example. 🚀 Sample implementations for real-world Android use cases. 🛠 Unit tests included!

  2. GameOfLife

    This is a simple simulation for the Game of life by John Conway written in JetPack Compose

📱App

  1. material-sudoku

    a clean and simple sudoku game, designed to feel at home on the Android platform.

  2. Chroma

    Chroma is a chromatic tuner, the perfect app to help you tune your musical instruments with precision and elegance.

  3. topcorn

    A minimalistic movie listing app to browse IMDB's top 250 movies, built to demonstrate MVVM with latest hot-trending Android development tools.

  4. BLTaxi

    a simple app for calling a taxi in the city Banja Luka built using modern Android development tools

  5. upcoming-games

    Android app for viewing release dates and other details for every video game ever made.

🔧工具

  1. AidLearning-FrameWork

    AidLearning build Linux environment running on the Android devices with GUI, Deep-Learning and Python Visual Programming support. Now support VSCode,Jupyter, pyToApk! One-click install.一个运行在移动端(Android)上的支持图形化桌面的完整的Linux虚拟机,同时是一个支持深度神经网络开发的框架和平台,内置了最为流行的深度学习框架caffe/mxnet/keras/pytoch/tensorflow/ncnn/opencv...内置了可视化AI开发编辑器,内置了VSCode、Jupyter等流行的编程工具,支持触摸拖拽式界面设计,支持代码动态调试和运行。支持在移动端和PC端用python开发你的AI应用,支持把你的python源码转化为APP(Apk)发布。支持一键式安装,只需要安装一个10M的App即可自动引导完成安装。

  2. AndroidMonitor

    Android开发辅助工具fps,topActivity,activity启动耗时,电量cpu内存分析。适配全机型悬浮窗权限。

199元学习大礼包:点击领取
原文地址:https://androidweekly.io/android-dev-weekly-issue-277/
版权声明:禁止一切形式的转载-禁止商用-禁止衍生
公众号:Android开发技术周刊
扫码关注 Android 开发技术周报公众号


Android.mk(一)

Android.mk(一)


Android.mk的第一部分内容

用 C# 写脚本 如何输出文件夹内所有文件名

用 C# 写脚本 如何输出文件夹内所有文件名


大部分在 Windows 下的脚本都是使用 bat 或 cmd 写的,这部分的脚本对我来说可读性不好。这个可读性也是很主观的,对我来说用 C# 写脚本的可读性很强,但是换个小伙伴就不是了。在 .NET Core 下的 C# 可以通过 dotnet run 运行代码起来,此时特别适合用来写脚本

大部分在 Windows 下的脚本都是使用 bat 或 cmd 写的,这部分的脚本对我来说可读性不好。这个可读性也是很主观的,对我来说用 C# 写脚本的可读性很强,但是换个小伙伴就不是了。在 .NET Core 下的 C# 可以通过 dotnet run 运行代码起来,此时特别适合用来写脚本

我需要输出一个文件夹里面的根目录的所有文件,输出一个文件夹的顶层文件的方法可以使用 Directory.GetFiles 拿到文件夹的顶层文件,然后遍历输出。此时注意需要引用 System.IO 命名空间

using System.IO;  static void Main(string[] args)  {   var folder = @"e:\lindexi\";   foreach (var file in Directory.GetFiles(folder))   {    Console.WriteLine(file);   }   Console.Read();  }

这就是整个脚本的核心代码了,十分简单,通过 dotnet run 命令就可以跑起来

额外的,在 Directory.GetFiles 可以输入通配符进行选择输出的文件

   foreach (var file in Directory.GetFiles(folder, "*.enbx"))   {    Console.WriteLine(file);   }

如上面代码就输出文件夹里面后缀是 .enbx 的文件

如果想要遍历所有的子文件夹的文件,可以通过加上 SearchOption.AllDirectories 参数

   foreach (var file in Directory.GetFiles(folder, "*.enbx", SearchOption.AllDirectories))   {    Console.WriteLine(file);   }

本文代码放在 github 欢迎小伙伴访问


System.Timers.Timer

System.Timers.Timer


前言

  System.Timers.Timer组件是基于服务器的计时器,它能够指定在应用程序中引发Elapsed事件周期性间隔,以处理相应事件。

使用示例:

  

运行结果展示:

  

System.Timers.Timer属性、方法解读:

  1)默认100毫秒触发一次Elapsed事件,可通过其属性Interval设置时间间隔。

  2)初始化Timer对象时,AutoReset默认为true,表示重复计时;若AutoReset=false,则执行一次。

  3)从上面的结果中可以看出,Elapsed事件绑定相当于开辟另外一个线程去执行。(这里为了使展示效果比较明显,将Inertval设置为1000,事件中休息2000)

  4)_timer.Enable=true和_timer.Start()效果一致,都是启动计时器。

  5)System.Timers.Timer与System.Threading.Timer原理一样。


用asp.net core结合fastdfs打造分布式文件存储系统

用asp.net core结合fastdfs打造分布式文件存储系统


最近被安排开发文件存储微服务,要求是能够通过配置来无缝切换我们公司内部研发的文件存储系统,FastDFS,MongDb GridFS,阿里云OSS,腾讯云OSS等。根据任务紧急度暂时先完成了通过配置来无缝切换内部文件系统以及FastDFS。至于MongDb GridFS,阿里云OSS,腾讯云OSS等则后期需要的话再开发对应的提供者程序集合。

作者:依乐祝
首发公众号:DotNetCore实战
原文链接: https://www.cnblogs.com/yilezhu/p/12797543.html

今天主要是对开发过程,以及对FastDFS这个通用的分布式文件存储服务的单机及集群安装部署过程做个总结。希望对想要自建分布式文件系统的朋友有所帮助。

什么是FastDFS

这里先简单介绍下分布式文件存储系统。
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
  Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
  Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
  Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

FastDFS开源地址:https://github.com/happyfish100

FastDFS的单机版安装

这里先简单介绍下单机版的安装,跟着做你也可以从0还是搭建一个单机版的FastDFS。集群版也是在单机版基础上安装的。

第一步 安装相关工具

如果已经安装和wget可以跳过这一步

yum -y install vim wget unzip

-y:不经过询问直接同意所有操作
vim:linux上面一个比较好用的文本编辑软件
wget:linux上文件下载工具

第二步 安装相关依赖

yum install -y gcc-c++ perl

第三步 安装libfastcommon

大家可以直接到github上面先找到ibfastcommon。这里为了大家方便查找。我已经把把链接给大家整理好了
libfastcommon
这里大家可以先下载到本地,然后再传至服务器上面。这里我使用的是FinalShell。具体操作就不在这里详细说了。
这里目录为:/root/fastdfs/
下载下来的是zip格式压缩包,然后,我们解压zip

unzip libfastcommon-master.zip

进入到刚刚解压的文件里面

cd libfastcommon-master/

进行编译安装

./make.sh && ./make.sh install


``shell
./make.sh && ./make.sh install

#### 第五步 修改配置文件切换到配置文件目录下```shellcd /etc/fdfs/

查看所有配置文件
使用ls命令就行了

去除所有的.sample后缀

cp client.conf.sample client.confcp storage.conf.sample storage.confcp storage_ids.conf.sample storage_ids.confcp tracker.conf.sample tracker.conf

我们再次使用ls命令查看

可以看到我们已经去除了所有的.sample后缀
下一步,创建文件夹,分别创建client,storage,tracker文件夹

mkdir -p /home/software/fastfdfs/data/clientmkdir -p /home/software/fastfdfs/data/storagemkdir -p /home/software/fastfdfs/data/tracker
client.config配置

下面我们开始配置文件修改,首先修改的是clietn.conf,使用vim编辑器进行文件的编辑

vim client.conf

使用 :set number 显示行数
修改第11行,确定日志文件的存储路径,这里用我们刚刚创建client文件夹路径

base_path = /home/software/fastdfs/data/client

修改第22 行,tracker的地址与端口,根据实际情况进行修改,我的是192.168.1.14。

这里貌似有两个tracker_server,毕竟是单机版部署因此我这里注释了一个
tracker_server = 192.168.1.14:22122

修改号之后记得保存修改!

storage.conf修改

下面我们修改storage.conf。同上是用vim进行修改
首先我们修改下11行的分组设置

group_name = group1

接下来修改49行的基础路径,这里也用上面我们已经创建的路径

base_path = /home/software/fastdfs/data/storage

修改第129行的storage路径。

store_path0 = /home/software/fastdfs/data/storage
注意:这里提示下:存储路径的顺序很重要,不要弄乱了,
基础路径应该独立于存储路径,即尽量让这两个路径不一样。这里我设置了一样

修改第145行 ,配置tracker的IP地址与端口。至于如何填写这个地址,上面配置client.conf的时候,我们就已经说过了。

tracker_server = 192.168.1.14:22122

tracker.conf 配置

现在修改tracker.conf文件
修改第23行,修改tracker的基础路径。这个路径的文件夹我们刚刚在上面已经创建过了

base_path = /home/software/fastdfs/data/tracker

修改第57行 归属组设置

store_group = group1

第六步 启动tracker 与storage

启动tracker

fdfs_trackerd /etc/fdfs/tracker.conf start

启动storage

fdfs_storaged /etc/fdfs/storage.conf start

测试是否启动成功,我们尝试上传文件。我的root文件夹下有一张图片

fdfs_test /etc/fdfs/client.conf upload /root/fastdfs/test.jpeg

如上图所示表示上传成功。

第七步 安装nginx访问图片

这里由于服务器已经安装了nginx,因此需要在现有的nginx的版本基础上安装新的fastdfs的模块。,安装方法可能略有不同
首先查看下nginx的版本

nginx -V

这里需要注意一下,如果你服务器上没有安装过nginx则需要先安装nginx的依赖,然后再进行安装

yum -y install gcc-c++ zlib-devel pcre-devel

如下图所示:

因此我们需要下载对应版本的源码

wget >tar zxvf nginx-1.14.0.tar.gz

下载nginx的fastdfs模块,这里我已经帮大家把这个项目github地址整理好了。
astdfs-nginx-module
这这里我们可以先下载到自己电脑上,再上传服务器。
进行解压

unzip fastdfs-nginx-module-master.zip

这里由于我们已经安装了nginx,因此需要备份之前的nginx防止出现问题进行还原

mv /usr/sbin/nginx /usr/sbin/nginx.backcp -rf /etc/nginx/ /etc/nginx.back

切换到nginx压缩包的解压目录里面去

cd nginx-1.16.1

进行配置检测并且添加模块

./configure --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --add-module=/root/fastdfs/fastdfs-nginx-module-master/src/

--prefix : nginx的安装目录
--add-module:解压后模块所在目录,记得要加上src

执行如下命令进行nginx的重新编译,如果之前已经安装了nginx则不能执行install,否则会覆盖之前的配置文件,也可以在安装后再把之前的配置覆盖过来。

make && make install

拷贝编译后的nginx到原来的安装目录

cp objs/nginx /usr/sbin/nginx

重启nginx

systemctl restart nginx//第二种方式nginx -s reload//第一次安装,直接输入nginxnginx

切换至fastdfs的解压包里面去

cd /root/fastfdfs/fastdfs-master

进行文件的复制

cp conf/http.conf /etc/fdfs/cp conf/mime.types /etc/fdfs/

切换至fastdfs-nginx-module的解压目录下面

cd /root/fastdfs/fastdfs-nginx-module-master

进行配置文件的复制

cp src/mod_fastdfs.conf /etc/fdfs/
mod_fastdfs.conf配置

修改/etc/fdfs下面的mod_fastdfs.conf配置文件

vim /etc/fdfs/mod_fastdfs.conf

修改 40行,更改tracker的ip地址与端口

tracker_server=192.168.1.14:22122

修改48行的group_name

修改53行 url地址中是否包含组名,如果链接中包含group则需要设置为true

url_have_group_name = true

修改62行 storage所在目录

store_path0=/home/software/fastdfs/data/storage

保存修改。

nginx修改

这里注意,每个笨的配置文件存储的方式不同,此步骤可能有所不同。
进行nginx配置文件的修改,我们可以切换到nginx的安装目录下面。也可以直接输入如下命令

注意:这里我的nginx版本为1.16.1,配置文件为conf.d下面的所有的*.conf文件。因此我的输入命令如下:

vim /etc/nginx/conf.d/default.conf 

进行nginx.conf的修改,如下图所示:

  server {   listen  8888;   server_name 192.168.1.93;     location ~/group([0-9])/M00 {    #root html;    #index index.html index.htm;    root /home/software/fastdfs/data/storage/data;    ngx_fastdfs_module;   }  }

多个group的配置

当配置多个组,且mod_fastdfs.conf 里面指定了url_have_group_name= true 时,配置方式:

location ~ /group([0-9]) /M00 {  root /home/software/fastdfs/data/storage/data;  ngx_fastdfs_module;}

比如:在group1上的 nginx 的nginx.conf 配置是

location /group1/M00 {  root /home/software/fastdfs/data/storage/data;  ngx_fastdfs_module;}

比如:在group2上的 nginx 的nginx.conf 配置是

location /group2/M00 {  root /home/software/fastdfs/data/storage/data;  ngx_fastdfs_module;}

查看nginx的配置文件是否有效

nginx -t

显示 is ok没有任何问题,现在启动nginx。这里我配置为开机自动启动

systemctl restart nginx// 第二种方式nginx -s reload

依照上面的方式,我们重新上传一张图片。并进行访问
测试是否启动成功,我们尝试上传文件。我的root文件夹下有一张图片

fdfs_test /etc/fdfs/client.conf upload /root/fastdfs/test.jpeg

上传成功,访问下面的地址

路径说明

group1:表示这张图片被保存在了哪个组当中,
M00:代表磁盘目录,如果电脑只有一个磁盘那就只有M00, 如果有多个磁盘,那就M01、M02...等等。
00/00:代表磁盘上的两级目录,每级目录下是从00到FF共256个文件夹,两级就是256*256个。
wKgBE1r-fICAcd3kAAHY-4ojheI481.jpeg表示被存储到storage上的test.jpeg被重命名的名字,这样做的目的是为了防止图片名字重复。
我们到单机版的数据目录下查看一下是否有我们刚才上传的图片,发现是有的返回的图片信息中明确说明了存储在了group1下面。

FastDFS集群版的安装

这里集群版的安装是在单机版的基础上安装的。

机器准备

IP作用模块
192.168.1.14storage(group1) tracker1fastdfs+nginx+fastdfs-nginx-module
192.168.1.15storage(group1)fastdfs+nginx+fastdfs-nginx-module
192.168.1.16storage(group2) tracker2fastdfs+nginx+fastdfs-nginx-module
192.168.1.93storage(group2)fastdfs+nginx+fastdfs-nginx-module
192.168.1.197VIP(对外提供服务)nginx

安装步骤

软件准备

在所有服务器上创建如下目录用来存储需要安装的软件包

mkdir -p ~/fastdfs/

在tracker1上下载所需要的软件安装包,并放在如下目录下

~/fastdfs/

查看如下所示:

进入对应的文件夹并拷贝对应的文件到其他几台服务器上:

scp ./* root@192.168.1.15:~/fastdfs/scp ./* root@192.168.1.16:~/fastdfs/scp ./* root@192.168.1.93:~/fastdfs/scp ./* root@192.168.1.197:~/fastdfs/

在storage服务器及tracker服务器都创建如下的文件夹,用来存放fastdfs的数据及日志文件

mkdir -p /home/software/fastfdfs/clientmkdir -p /home/software/fastfdfs/storagemkdir -p /home/software/fastfdfs/tracker

在所有服务器上执行·如下命令安装相关工具

yum -y install vim wget unzip

在所有sotrage及tracker服务器上执行如下命令安装相关依赖

yum install -y gcc-c++ perl
安装

这些操作需要在所有storage及tracker服务器上都进行操作

storage及tracker服务器安装libfastcommon

在需要安装fastdfs的storage及tracker服务器上安装libfastcommon
这里我们进入安装文件目录~/fastdfs/,执行如下命令,解压并编译安装:

unzip libfastcommon-master.zipcd libfastcommon-master/./make.sh && ./make.sh install

出现如下图所示则表示安装成功

storage及tracker服务器安装fastdfs

在需要安装fastdfs的storage及tracker服务器上安装fastdfs
这里我们进入安装文件目录~/fastdfs/,执行如下命令,解压并编译安装:

unzip fastdfs-master.zipcd fastdfs-master/./make.sh && ./make.sh installcp conf/http.conf /etc/fdfs/cp conf/mime.types /etc/fdfs/

进行文件的复制

cp conf/http.conf /etc/fdfs/cp conf/mime.types /etc/fdfs/
修改配置文件

切换到配置文件目录,并执行如下命令去除所有的.sample后缀:

cd /etc/fdfs/cp client.conf.sample client.confcp storage.conf.sample storage.confcp storage_ids.conf.sample storage_ids.confcp tracker.conf.sample tracker.conf

修改client.config配置

需要测试的时候才需要配置此client.conf配置

vim client.conf

修改内容如下:

11 base_path = /home/software/fastdfs/client22 tracker_server = 192.168.1.14:22122

vim修改storage.conf
修改内容如下:

11 group_name = group149 base_path = /home/software/fastdfs/storage129 /home/software/fastdfs/data/storage145 tracker_server = 192.168.1.14:22122

vim修改tracker.conf配置

这里只有tracker服务器才需要配置此配置及 14跟16

修改内容如下:

23 base_path = /home/software/fastdfs/tracker57 store_group = group1
安装nginx

只有sotrage服务器及vip服务器需要安装nginx用来提供文件的访问
在安装nginx前需要安装相关的依赖并下载对应的源码,执行如下命令。此文件也保存到文件安装目录

yum -y install gcc-c++ zlib-devel pcre-develwget zxvf nginx-1.14.0.tar.gz

解压nginx的fastdfs模块,并进入到文件夹下进行配置文件的复制

nginx的fastdfs模块在所有storage服务器上进行安装

unzip fastdfs-nginx-module-master.zipcd ~/fastdfs/fastdfs-nginx-module-mastercp src/mod_fastdfs.conf /etc/fdfs/

进入到nginx源码目录,进行配置检测并添加对应的fastdfs模块。然后进行nginx的安装

./configure --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --add-module=/root/fastdfs/fastdfs-nginx-module-master/src/make && make install#如有需要可以拷贝nginx到sbin目录cp objs/nginx /usr/sbin/nginx
mod_fastdfs.conf配置

vim修改/etc/fdfs下面的mod_fastdfs.conf配置文件

40 tracker_server=192.168.1.14:2212248 group_name=group153 url_have_group_name = true62 store_path0=/home/software/fastdfs/storage
nginx配置修改

只有sotrage服务器及vip服务器需要安装,
group1的服务器需要新增如下server配置,root路径为storage的data路径

  server {   listen  8888;   server_name 192.168.1.93;     location /group1/M00 {    #root html;    #index index.html index.htm;    root /home/software/fastdfs/storage/data;    ngx_fastdfs_module;   }  }

group2的服务器上新增如下server配置,root路径为storage的data路径

  server {   listen  8888;   server_name 192.168.1.93;     location /group2/M00 {    #root html;    #index index.html index.htm;    root /home/software/fastdfs/storage/data;    ngx_fastdfs_module;   }  }

vip服务器的nginx配置如下:

#设置 group1 的服务器upstream fdfs_group1 { server 192.168.1.14:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.15:8888 weight=1 max_fails=2 fail_timeout=30s;}#设置 group2 的服务器upstream fdfs_group2 { server 192.168.1.16:8888 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.93:8888 weight=1 max_fails=2 fail_timeout=30s;}server { listen  80; server_name 192.168.1.197; #charset koi8-r; #access_log /var/log/nginx/host.access.log main;		#设置默认路径 location / {  root html;  index index.html index.htm; }	#设置 group 的负载均衡参数 location /group1/M00 {  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_pass } location /group2/M00 {  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_pass }}

查看nginx的配置文件是否有效

nginx -t

显示 is ok没有任何问题,现在启动nginx。这里我配置为开机自动启动

# 服务形式的nginx重启方式systemctl restart nginx//第二种方式nginx -s reload//第一次安装,直接输入nginxnginx

依照上面的方式,我们重新上传一张图片。并进行访问
测试是否启动成功,我们尝试上传文件。我的root文件夹下有一张图片

fdfs_test /etc/fdfs/client.conf upload /root/fastdfs/test.jpeg

上传成功,访问下面的地址

asp.net core操作FastDFS

这里的微服务是基于abp vnext的。只是在应用层进行相关的服务开发。这里需要说明下,这里我是使用工厂模式,根据配置来创建对应的文件操作提供者,进而对对应的文件服务器上的文件进行操作的。这里我只摘录FastDFS相关的代码供大家参考。

第一步 安装对应的nuget包

这里我用的是更新时间相对比较近下载量相对比较多的作者的nuget包,

Install-Package FastDFSNetCore -Version 1.2.5

第二步,编写一个FastDFSProvider

具体的代码如下所示:

 /// <summary> /// 功能介绍:FastDFS提供者 /// 作者:lzhu /// 创建日期:2020/4/23 19:54:35 /// </summary>public class FastDFSProvider : IStorageProvider, ITransientDependency {  /// <summary>  /// 提供程序名称  /// </summary>  public string ProviderName => "FastDFS";  //配置  private readonly FastDFSConfig _fastDFSConfig;  /// <summary>  /// 构造函数  /// </summary>  /// <param name="fastDFSConfig">注入配置数据</param>  public FastDFSProvider(FastDFSConfig fastDFSConfig)  {   _fastDFSConfig = fastDFSConfig ?? throw new ArgumentNullException(nameof(fastDFSConfig));   string[] trackers = fastDFSConfig.Trackers.Split(',', StringSplitOptions.RemoveEmptyEntries);   var trackerIPs = new List<IPEndPoint>();   foreach (var onetracker in trackers)   {    trackerIPs.Add(new IPEndPoint(IPAddress.Parse(onetracker), fastDFSConfig.Port));   }   ConnectionManager.Initialize(trackerIPs);  }  /// <summary>  /// 通过文件名删除对应的文件  /// </summary>  /// <param name="objectName">对象名称</param>  /// <param name="groupName">分组名称</param>  /// <returns>是否成功</returns>  public async Task<bool> DeleteObjectByNameAsync(string objectName, string groupName = "")  {   RestoreFileName(objectName, out string fileName, out groupName);   await FastDFSClient.RemoveFileAsync(groupName, fileName);   return true;  }  /// <summary>  /// 获取网关连接  /// </summary>  /// <returns>网关连接</returns>  public Task<string> GetGateWayUrl() => Task.FromResult(_fastDFSConfig.GateWayUrl);  /// <summary>  /// 获取对象二进制数组  /// </summary>  /// <param name="groupName">组名称</param>  /// <param name="objectName">对象名称</param>  /// <returns>对象的二进制数组</returns>  public async Task<byte[]> GetObjectByteAsync(string objectName, string groupName = "")  {   RestoreFileName(objectName, out string fileName, out groupName);   var storageNode = await GetStorageNodeAsync(groupName);   return await FastDFSClient.DownloadFileAsync(storageNode, fileName);  }  /// <summary>  /// 获取对象流  /// </summary>  /// <param name="groupName">组名称</param>  /// <param name="objectName">对象名称</param>  /// <returns>对象流</returns>  public async Task<Stream> GetObjectStreamAsync(string objectName, string groupName = "")  {   RestoreFileName(objectName, out string fileName, out groupName);   var storageNode = await GetStorageNodeAsync(groupName);   FDFSFileInfo fileInfo = await FastDFSClient.GetFileInfoAsync(storageNode, fileName);   Stream stream = new MemoryStream();   int limit = 1024 * 100;//每次获取100KB的数据   //如果文件大小大于100KB 分次写入   if (fileInfo.FileSize >= limit)   {    long offset = 0;    long len = limit;    while (len > 0)    {     byte[] buffer = await FastDFSClient.DownloadFileAsync(storageNode, fileName, offset, len);     stream.Write(buffer, 0, int.Parse(len.ToString()));     stream.Flush();     offset += len;     len = (fileInfo.FileSize - offset) >= limit ? limit : (fileInfo.FileSize - offset);    }   }   else   {    //如果文件大小小小于100KB 直接写入文件    byte[] buffer = await FastDFSClient.DownloadFileAsync(storageNode, fileName);    stream.Write(buffer, 0, buffer.Length);    stream.Flush();   }   stream.Seek(0, SeekOrigin.Begin);   return stream;  }  /// <summary>  /// 存储文件  /// </summary>  /// <param name="objectByte">对象</param>  /// <param name="objectName">对象名</param>  /// <param name="groupName">分组</param>  /// <returns></returns>  public async Task<string> StoreObjectByteAsync(byte[] objectByte, string objectName, string groupName = "")  {   var storageNode = await GetStorageNodeAsync("");   var filePath = await FastDFSClient.UploadFileAsync(storageNode, objectByte, Path.GetExtension(objectName));   return storageNode.GroupName + "/" + filePath;  }  /// <summary>  /// 存储文件  /// </summary>  /// <param name="objectStream">文件流</param>  /// <param name="objectName">对象名</param>  /// <param name="groupName">分组</param>  /// <returns>文件路径</returns>  public async Task<string> StoreObjectStreamAsync(Stream objectStream, string objectName, string groupName = "")  {   var storageNode = await GetStorageNodeAsync("");   var filePath = await FastDFSClient.UploadFileAsync(storageNode, objectStream, Path.GetExtension(objectName));   return storageNode.GroupName + "/" + filePath;  } }

第三步 在分布式配置中心中进行配置

这里的分布式配置中心中进行FastDFS的配置如下:

"ObjectStorage": { "StoreType": "FastDFS", "FastDFS": {  "Trackers": "192.168.1.14,192.168.1.16",  "Port": 22122,  "GateWayUrl": " } }

第四步 文件提供者工厂方法中加入FastDFS的处理

工厂方法根据上面配置中的StoreType从而知道对应的存储是往FastDFS集群进行存储的,进而再加载对应的FastDFS的配置,然后创建上面的FastDFSProvider。
主要代码摘录如下:

 case "RondsDFS": 	 { var rondsDFSSection = _configuration.GetSection("ObjectStorage:RondsDFS"); if (rondsDFSSection == null)  throw new ArgumentNullException("RondsDFS is not configured![OObjectStorage:RondsDFS]");  StorageProvider = _serviceProvider.GetRequiredService<RondsDFSProvider>();  break;  }

总结

今天首先给大家讲解了如何搭建FastDFS单机版及集群版,然后讲解了如何通过asp.net core对FastDFS进行操作。当然由于我的文件系统对应多个文件存储程序,因此这里只是把FastDFS作为其中一个提供者进行处理。大伙可以只参考其中的操作方法即可。本来想录个视频的,毕竟安装过程稍显复杂,奈何机器不允许,Pass了!有问题可以加QQ两千人群637326624进行交流。

参考文章

https://zhuanlan.zhihu.com/p/80256918
https://blog.51cto.com/13712476/2130525
https://www.cnblogs.com/youzhibing/p/9187765.html
https://github.com/happyfish100/fastdfs/wiki