file.html(测试上传)
function UploadFile(){
var fileObj = $("#img")[0].files[0];
var form = new FormData();//创建一个form对象类似
form.append("k1", "v1");
form.append("fff", fileObj);
$.ajax({
type:'POST',
url: 'http://127.0.0.1:8000/uploadfile',
data: form,
dataType:"json",
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
//如果不写这两句,改变里面的格式,影响内容
success: function(arg){
console.log(arg);
function Downloadfile(){
var fileObj = $("#img")[0].files[0];
var form = new FormData();//创建一个form对象类似
form.append("k1", "v1");
form.append("fff", fileObj);
$.ajax({
type:'POST',
url: 'http://127.0.0.1:8000/uploadfile',
data: form,
dataType:"json",
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
//如果不写这两句,改变里面的格式,影响内容
success: function(arg){
console.log(arg);
}
})
}
}
})
}
function Downloadfile(){
var fileObj = $("#img")[0].files[0];
var form = new FormData();//创建一个form对象类似
form.append("k1", "v1");
form.append("fff", fileObj);
$.ajax({
type:'get',
url: 'http://127.0.0.1:8000/downloadfile?file_name=content1.png&group_id=group1/M00/00/00/rBUACl6yP8CALSg8AAEMCvDz0B0368.png',
// data: {
// 'group_id':'group1/M00/00/00/rBUACl6yR9OAAvEcAABRMd73qoY095.png',
// 'file_name':'8.png'
// },
dataType:"json",
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
//如果不写这两句,改变里面的格式,影响内容
success: function(){
console.log('成功');
}
})
}
fastdfs客户端配置文件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=/home/guan/fastdfs
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.144.192.55: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
server.py
# -*- coding:utf-8 -*-
import json
import tornado.ioloop
import tornado.web
from fdfs_client.client import *
from tornado.httpserver import HTTPServer
from tornado.netutil import bind_sockets
from tornado.process import fork_processes
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return str(obj, encoding='utf-8')
return json.JSONEncoder.default(self, obj)
class MainHandler(tornado.web.RequestHandler):
def set_default_headers(self):
print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", "*") # 这个地方可以写域名
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
def get(self):
self.render('index.html')
class UploadFileHandler(tornado.web.RequestHandler):
def set_default_headers(self):
print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", "*") # 这个地方可以写域名
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
def get(self):
pass
def post(self, *args, **kwargs):
file_metas = self.request.files["fff"]
res={}
self.set_header('Content-Type', 'application/json; charset=UTF-8')
for meta in file_metas:
file_name = meta['filename']
ext_name = file_name.split(".")[-1]
client_file = 'client.conf'
trackers = get_tracker_conf(client_file)
client = Fdfs_client(trackers)
t1=time.time()
ret_upload = client.upload_by_buffer(meta['body'],file_ext_name=ext_name)
print('压力测试: ','文件大小: 592036495b','上传耗时: ',time.time()-t1)
# if ret_upload.get('Status')!='Upload successed.':
# return ({
# 'msg':'fail'
# })
if ret_upload.get('Status')!='Upload successed.':
res = {
"msg": "上传失败"
}
self.set_status(400)
else:
res=ret_upload
res['url']='192.144.192.55:80/'+str(ret_upload['Remote file_id'], encoding='utf-8')
print(res)
self.write(json.dumps(res,cls=MyEncoder,))
self.finish()
class DeleteFileHandler(tornado.web.RequestHandler):
def set_default_headers(self):
# print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
def get(self):
# ('Delete file successed.', b'group1/M00/00/00/rBUACl6yNeOATBuFAAAACwc-XUQ013.txt', b'192.144.192.55')
# group1 / M00 / 00 / 00 / rBUACl6yM3uAf7gSAAEMCvDz0B0420.png
group_id = self.get_query_argument('group_id', '').encode(encoding = "utf-8")
# download
client_file = 'client.conf'
trackers = get_tracker_conf(client_file)
client = Fdfs_client(trackers)
ret_delete = client.delete_file(group_id)
if ret_delete[0]=='Delete file successed.':
res = {
'Status': ret_delete[0],
'Remote file_id': ret_delete[1],
'Storage IP': ret_delete[2],
'url':'192.144.192.55:80/'+str(ret_delete[1], encoding='utf-8')
}
else:
res={
'msg':'删除失败'
}
self.set_status(400)
# self.write(json.dumps(res, cls=MyEncoder, ))
# self.finish()
self.write(json.dumps(res, cls=MyEncoder, ))
self.finish()
print(ret_delete)
class DownloadFileHandler(tornado.web.RequestHandler):
def set_default_headers(self):
# print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", "*") # 这个地方可以写域名
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
# {'Remote file_id': b'group1/M00/00/00/rBUACl6yNeOATBuFAAAACwc-XUQ013.txt', 'Content': 'content1.txt',
# 'Download size': '11B', 'Storage IP': b'192.144.192.55'}
def get(self):
# group1 / M00 / 00 / 00 / rBUACl6yM3uAf7gSAAEMCvDz0B0420.png
# path = self.get_query_argument('path', '')
file_name = self.get_query_argument('file_name', '')
self.set_header('Content-Type', 'application/octet-stream')
# filename 指定下载名字
self.set_header('Content-Disposition', 'attachment; filename=' + file_name)
group_id = self.get_query_argument('group_id', '').encode('utf8')
print(file_name, group_id)
# download
# try:
client_file = 'client.conf'
trackers = get_tracker_conf(client_file)
client = Fdfs_client(trackers)
# print(os.path.join(path,file_name))
ret_download = client.download_to_file(file_name,group_id)
res=ret_download
res['url'] = '192.144.192.55:80/' + str(ret_download['Remote file_id'], encoding='utf-8')
# except:
# res={
# 'msg':'下载失败'
# }
# self.set_status(400)
self.write(json.dumps(res, cls=MyEncoder, ))
self.finish()
settings = {
'template_path': 'template',
}
application = tornado.web.Application([
(r"/index", MainHandler),
(r"/uploadfile", UploadFileHandler),
(r"/deletefile", DeleteFileHandler),
(r"/downloadfile", DownloadFileHandler),
], **settings)
if __name__ == "__main__":
sockets = bind_sockets(port=8000, address="127.0.0.1")
fork_processes(10)
server = HTTPServer(application, max_buffer_size=604857600)
server.add_sockets(sockets)
# application.listen(8000)
tornado.ioloop.IOLoop.instance().start()
用postman测试删除
简述.PNG