from django.http import HttpResponse
from django.shortcuts import render, redirect
from user.models import User
import pyhdfs
import datetime
from django.contrib import messages
import os
from django.http import StreamingHttpResponse
import os.path
from django.utils.encoding import escape_uri_path
# Create your views here.
# 首页函数
def index(request):
return redirect('/openDir/?path=all')
# 登陆函数
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
if User.objects.filter(username=username,password=password):
request.session['is_login'] = True
request.session['user'] = username
return redirect('/index/')
else:
result = "请检查账号和密码是否正确!"
return render(request, 'login.html', locals())
# 退出登录函数
def logout(request):
try:
del request.session['is_login']
except:
print('失败')
return redirect('/login/')
# 重置密码函数
def register(request):
return render(request, 'register.html')
# 注册函数
def registers(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
reg = User(username=username, password=password)
if len(password) < 6:
result = '密码需大于6位'
elif User.objects.filter(username=username):
result = "账号已存在!"
else:
reg.save()
result = "注册成功!"
return redirect('/login/')
return render(request, 'register.html', locals())
def openDir(request):
is_login = request.session.get('is_login')
print(is_login)
if not is_login:
return redirect('/login/')
else:
data = {}
fileData = {}
imgList = ['png', 'jpg', 'jpeg', 'gif']
mvList = ['mp4', 'avi']
mcList = ['mp3']
docList = ['doc', 'docx', 'DOC', 'DOCX']
paths = request.GET.get('path').split('%')
user = request.session['user']
url = request.get_full_path()
home = "/user/" + user + "/" # 用户根目录
if user == 'admin':
home = '/'
user = 'root'
nowpath = home
if len(paths) > 1:
for i in paths[1:]:
nowpath = nowpath + i + '/'
fs = pyhdfs.HdfsClient(hosts='8.131.237.47,50070', user_name=user)
print(home)
if not fs.exists(home):
fs.mkdirs(home) # 目录不存在时创建目录
con_sum = fs.get_content_summary(home)
summ = {}
summ['quota'] = 20 # 总配额
if user != 'root':
summ['quota'] = 5
summ['spaceConsumed'] = round(con_sum['spaceConsumed'] / 1024 / 1024 / 1024 / 2, 4) # 已使用内存
summ['directoryCount'] = con_sum['directoryCount'] - 1 # 文件夹数
summ['fileCount'] = con_sum['fileCount'] # 文件数量
summ['surplus'] = summ['spaceConsumed'] / summ['quota'] * 100
data['sum'] = summ
# 新建文件夹
if request.POST.get('newdir'):
newdir = request.POST.get('newdir')
try:
new = nowpath + newdir
if fs.mkdirs(new):
result = '创建成功'
else:
result = '创建失败'
except:
result = '创建失败'
messages.success(request, result)
return redirect(url)
# 下载文件
elif request.POST.get('down'):
down = request.POST.get('down')
filename = down.split('/')[-1]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
file_path = BASE_DIR + '/static/downfile/' + filename
# if not path.is_dir():
# os.makedirs(path)
result = ''
if fs.get_file_status(down)['type'] == 'DIRECTORY':
result = '暂不支持下载文件夹'
messages.success(request, result)
return redirect(url)
else:
try:
fs.copy_to_local(down, file_path)
# 判读downfile文件夹是否存在该文件
if not os.path.isfile(file_path): # 判断下载文件是否存在
return HttpResponse("Sorry but Not Found the File")
def file_iterator(file_path, chunk_size=512):
"""
文件生成器,防止文件过大,导致内存溢出
:param file_path: 文件绝对路径
:param chunk_size: 块大小
:return: 生成器
"""
with open(file_path, mode='rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
try:
# 设置响应头
# StreamingHttpResponse将文件内容进行流式传输,数据量大可以用这个方法
response = StreamingHttpResponse(file_iterator(file_path))
# 以流的形式下载文件,这样可以实现任意格式的文件下载
response['Content-Type'] = 'application/octet-stream'
# Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
response['Content-Disposition'] = "attachment;filename={0}".format(escape_uri_path(filename))
print("attachment;filename='{0}'".format(filename))
except:
result = '下载失败'
except:
result = '下载失败'
return response
# 删除
elif request.POST.get('delet'):
deletp = request.POST.get('delet')
if fs.get_file_status(deletp)['type'] == 'DIRECTORY':
dirList = fs.listdir(deletp)
print('deletp=', deletp)
try:
if fs.delete(deletp, recursive=True):
result = '删除成功'
else:
result = '删除成功'
except:
result = '删除成功'
messages.success(request, result)
return redirect(url)
# 重命名
if request.POST.get('rename'):
new_name = request.POST.get('rename')
old_name = request.POST.get('nowname')
paths = request.GET.get('path').split('%')
new = nowpath + new_name
try:
if fs.rename(old_name, new):
result = '修改成功'
else:
result = '修改失败'
except:
result = '修改失败'
messages.success(request, result)
return redirect(url)
# 搜索
elif request.POST.get('search'):
search = request.POST.get('search')
print(search)
def allFile(path):
dirList = fs.listdir(path)
for dirs in dirList:
thispath = path + dirs + '/'
status = fs.get_file_status(thispath)
if search in dirs:
statusD = {}
Type = status['type']
if Type != 'DIRECTORY':
Type = dirs.split('.')[-1]
if Type in imgList:
Type = 'jpg'