custom_file_storage

以fast_fdfs作為存儲后端

環(huán)境搭建fdfs

sudo docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
sudo docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.80.131:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage

客戶端安裝
https://github.com/JaceHo/fdfs_client-py

  • 克隆到本地修改

  • 修改文件,安裝時會報錯

setup.py 注釋兩行
 'ext_modules': [Extension('fdfs_client.sendfile',
                              sources=['fdfs_client/sendfilemodule.c'])],
fdfs_client-py/fdfs_client/storage_client.py  注釋以下行
from fdfs_client.sendfile import *

如果在使用時報關(guān)于字符編碼錯可以在 fdfs_client-py/fdfs_client/utils.py

def read(self, filenames):
        if isinstance(filenames, basestring):
            filenames = [filenames]

        read_ok = []
        for filename in filenames:
            try:
                #文件打開編碼為utf-8
                with open(filename,encoding='utf-8') as fp:
                    self.readfp(fp)
            except IOError as e:
                continue
            else:
                read_ok.append(filename)

        return read_ok

安裝 fdfs_client
python setup.py install

客戶端配置文件(客戶端會調(diào)用配置文件得到client對象)
client.conf

# connect timeout in seconds
# default value is 30s
connect_timeout = 30

# network timeout in seconds
# default value is 30s
network_timeout = 60

# the base path to store log files
# base_path=FastDFS客戶端存放日志文件的目錄

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server = fdfs_server:22122

# standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level = info

# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false

# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker = false

# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false

# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf

# HTTP settings
http.tracker_server_port = 80

# use "#include" directive to include HTTP other settiongs
##include http.conf

測試:fdfs_client

test.py
from fdfs_client.client import Fdfs_client
with open('./0.jpg','rb') as content:
    client = Fdfs_client('./client.conf')
    ret = client.upload_by_buffer(content.read())
    print(ret)

{
  'Group name': 'group1',
  'Local file name': ''',
  'Storage IP': '192.168.80.131',
  'Remote file_id': 'group1/M00/00/03/rBCzi10HvhOAbpotAAAi00HB9mU322.jpg',
  'Uploaded size': '8.00KB',
  'Status': 'Upload successed.'
}

存儲后端

from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client

@deconstructible
class FastDFSStorage(Storage):
    def __init__(self,base_url=None,client_conf=None):
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf
    def _save(self,name,content):
        #截取文件后綴
        suffix = name.split('.')[1]
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read(),suffix)
        # print(ret)
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file faild")
        file_name = ret.get('Remote file_id')
        return file_name


    def exists(self,name):
        return False

    def url(self,name):
        # print(self.base_url+name)
        http_url = self.base_url + name
        print(http_url)
        return http_url

setting.py配置

FDFS_URL = "http://192.168.80.131:8888/"
DEFAULT_FILE_STORAGE = 'fastdfs.storage.FastDFSStorage'
FDFS_CLIENT_CONF = os.path.join(BASE_DIR,'index/client.conf')

model.py

class Avatar(models.Model):
    name = models.CharField(max_length=32)
      #upload_to 自定義了存儲后端此處填什么沒有影響
    avatar = models.FileField(upload_to='icon',verbose_name='頭像')

admin.py

admin.site.register(Avatar)
image.png

views.py

def show_image(request):
    if request.method == 'GET':
        icons = models.Icon.objects.all()
        url = []
        for icon in icons:
            url.append(icon.icon.url)
            print(url)
        return HttpResponse("<image src='{}'>".format(url[0]))
        # return render(request,'show_image.html',{'url':url})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末震糖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毡咏,老刑警劉巖剃允,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杆勇,居然都是意外死亡贪壳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門蚜退,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闰靴,“玉大人,你說我怎么就攤上這事钻注÷烨遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵幅恋,是天一觀的道長杏死。 經(jīng)常有香客問我,道長捆交,這世上最難降的妖魔是什么淑翼? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮品追,結(jié)果婚禮上玄括,老公的妹妹穿的比我還像新娘。我一直安慰自己肉瓦,他們只是感情好遭京,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布银还。 她就那樣靜靜地躺著,像睡著了一般洁墙。 火紅的嫁衣襯著肌膚如雪蛹疯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天热监,我揣著相機與錄音捺弦,去河邊找鬼。 笑死孝扛,一個胖子當(dāng)著我的面吹牛列吼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苦始,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼寞钥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陌选?” 一聲冷哼從身側(cè)響起理郑,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咨油,沒想到半個月后您炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡役电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年赚爵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片法瑟。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冀膝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎挟,到底是詐尸還是另有隱情窝剖,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布氓扛,位于F島的核電站枯芬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏采郎。R本人自食惡果不足惜千所,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒜埋。 院中可真熱鬧淫痰,春花似錦、人聲如沸整份。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至火俄,卻和暖如春犯建,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓜客。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工适瓦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谱仪。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓玻熙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疯攒。 傳聞我的和親對象是個殘疾皇子嗦随,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容