Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def upload_files(request):
- if request.method == 'POST': # 如果请求method为POST, 上传文件都是用POST
- messages = [] # 由于并不是所有的文件都能成功上传, 所以这里做了一个给客户回显每一个文件上传状态信息的清单messages
- files_list = request.FILES.getlist('files[]') # 得到多个文件的清单
- for file in files_list:
- # file.name 文件名
- # file.content_type 文件类型
- # file.size 文件大小(可以考虑对文件大小进行限制)
- ext_name = os.path.splitext(file.name)[1]
- if ext_name != '.docx' and ext_name != '.doc':
- # 把此文件的错误信息, 放入messages清单, 并使用continue跳过此文件
- messages.append(file.name + ":文件格式并不是doc或者docx!")
- continue
- # 读取二进制数据
- bit_file = file.file.read()
- # 产生HASH,用HASH作为写入OS的文件名
- hash_hex_value = hashlib.sha3_256(bit_file).hexdigest()
- try:
- # 确认是否重复上传相同文件
- uploaded = UploadFile.objects.get(hash_hex__hash_hex=hash_hex_value,
- owner_username=request.user.get_username())
- messages.append(f"{file.name}:文件, 与已有文件:{uploaded.file_raw_name}重复!")
- continue
- except UploadFile.DoesNotExist:
- pass
- file_raw_name = file.name
- owner_username = request.user.get_username()
- try:
- hash_hex_obj = HashHex.objects.get(hash_hex=hash_hex_value)
- s = UploadFile(file_raw_name=file_raw_name,
- owner_username=owner_username,
- hash_hex=hash_hex_obj,
- )
- s.save()
- messages.append(file.name + ":快速上传成功!")
- except Exception:
- # 把文件写入, 文件系统, 文件名为Hash Hex
- checked_file = open(file_os_path + hash_hex_value, 'wb')
- checked_file.write(bit_file)
- checked_file.close()
- h = HashHex(hash_hex=hash_hex_value)
- h.save()
- # 保存到数据库
- s = UploadFile(file_raw_name=file_raw_name,
- owner_username=owner_username,
- hash_hex=h,
- )
- s.save()
- messages.append(file_raw_name + ":上传成功!")
- return render(request, 'files_mgmt_upload.html', {'messages': messages})
- else: # 如果不是POST,就是GET,表示为初始访问, 显示表单内容给客户
- return render(request, 'files_mgmt_upload.html')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement