Advertisement
ostankino_tower

Upload

Dec 3rd, 2020
1,390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.90 KB | None | 0 0
  1. def upload_files(request):
  2.     if request.method == 'POST':  # 如果请求method为POST, 上传文件都是用POST
  3.         messages = []  # 由于并不是所有的文件都能成功上传, 所以这里做了一个给客户回显每一个文件上传状态信息的清单messages
  4.         files_list = request.FILES.getlist('files[]')  # 得到多个文件的清单
  5.         for file in files_list:
  6.             # file.name 文件名
  7.             # file.content_type 文件类型
  8.             # file.size 文件大小(可以考虑对文件大小进行限制)
  9.             ext_name = os.path.splitext(file.name)[1]
  10.             if ext_name != '.docx' and ext_name != '.doc':
  11.                 # 把此文件的错误信息, 放入messages清单, 并使用continue跳过此文件
  12.                 messages.append(file.name + ":文件格式并不是doc或者docx!")
  13.                 continue
  14.  
  15.             # 读取二进制数据
  16.             bit_file = file.file.read()
  17.             # 产生HASH,用HASH作为写入OS的文件名
  18.             hash_hex_value = hashlib.sha3_256(bit_file).hexdigest()
  19.  
  20.             try:
  21.                 # 确认是否重复上传相同文件
  22.                 uploaded = UploadFile.objects.get(hash_hex__hash_hex=hash_hex_value,
  23.                                                   owner_username=request.user.get_username())
  24.                 messages.append(f"{file.name}:文件, 与已有文件:{uploaded.file_raw_name}重复!")
  25.                 continue
  26.             except UploadFile.DoesNotExist:
  27.                 pass
  28.             file_raw_name = file.name
  29.             owner_username = request.user.get_username()
  30.             try:
  31.                 hash_hex_obj = HashHex.objects.get(hash_hex=hash_hex_value)
  32.                 s = UploadFile(file_raw_name=file_raw_name,
  33.                                owner_username=owner_username,
  34.                                hash_hex=hash_hex_obj,
  35.                                )
  36.                 s.save()
  37.                 messages.append(file.name + ":快速上传成功!")
  38.             except Exception:
  39.                 # 把文件写入, 文件系统, 文件名为Hash Hex
  40.                 checked_file = open(file_os_path + hash_hex_value, 'wb')
  41.                 checked_file.write(bit_file)
  42.                 checked_file.close()
  43.  
  44.                 h = HashHex(hash_hex=hash_hex_value)
  45.                 h.save()
  46.  
  47.                 # 保存到数据库
  48.                 s = UploadFile(file_raw_name=file_raw_name,
  49.                                owner_username=owner_username,
  50.                                hash_hex=h,
  51.                                )
  52.                 s.save()
  53.                 messages.append(file_raw_name + ":上传成功!")
  54.         return render(request, 'files_mgmt_upload.html', {'messages': messages})
  55.  
  56.     else:  # 如果不是POST,就是GET,表示为初始访问, 显示表单内容给客户
  57.         return render(request, 'files_mgmt_upload.html')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement