views.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import hashlib
  2. import os
  3. from django.core.files.uploadedfile import UploadedFile
  4. from django.http import HttpResponse, HttpResponseServerError, JsonResponse
  5. from .models import FileModel
  6. from .tests import UNICODE_FILENAME, UPLOAD_TO
  7. from .uploadhandler import ErroringUploadHandler, QuotaUploadHandler
  8. def file_upload_view(request):
  9. """
  10. A file upload can be updated into the POST dictionary.
  11. """
  12. form_data = request.POST.copy()
  13. form_data.update(request.FILES)
  14. if isinstance(form_data.get('file_field'), UploadedFile) and isinstance(form_data['name'], str):
  15. # If a file is posted, the dummy client should only post the file name,
  16. # not the full path.
  17. if os.path.dirname(form_data['file_field'].name) != '':
  18. return HttpResponseServerError()
  19. return HttpResponse()
  20. else:
  21. return HttpResponseServerError()
  22. def file_upload_view_verify(request):
  23. """
  24. Use the sha digest hash to verify the uploaded contents.
  25. """
  26. form_data = request.POST.copy()
  27. form_data.update(request.FILES)
  28. for key, value in form_data.items():
  29. if key.endswith('_hash'):
  30. continue
  31. if key + '_hash' not in form_data:
  32. continue
  33. submitted_hash = form_data[key + '_hash']
  34. if isinstance(value, UploadedFile):
  35. new_hash = hashlib.sha1(value.read()).hexdigest()
  36. else:
  37. new_hash = hashlib.sha1(value.encode()).hexdigest()
  38. if new_hash != submitted_hash:
  39. return HttpResponseServerError()
  40. # Adding large file to the database should succeed
  41. largefile = request.FILES['file_field2']
  42. obj = FileModel()
  43. obj.testfile.save(largefile.name, largefile)
  44. return HttpResponse()
  45. def file_upload_unicode_name(request):
  46. # Check to see if Unicode name came through properly.
  47. if not request.FILES['file_unicode'].name.endswith(UNICODE_FILENAME):
  48. return HttpResponseServerError()
  49. # Check to make sure the exotic characters are preserved even
  50. # through file save.
  51. uni_named_file = request.FILES['file_unicode']
  52. FileModel.objects.create(testfile=uni_named_file)
  53. full_name = '%s/%s' % (UPLOAD_TO, uni_named_file.name)
  54. return HttpResponse() if os.path.exists(full_name) else HttpResponseServerError()
  55. def file_upload_echo(request):
  56. """
  57. Simple view to echo back info about uploaded files for tests.
  58. """
  59. r = {k: f.name for k, f in request.FILES.items()}
  60. return JsonResponse(r)
  61. def file_upload_echo_content(request):
  62. """
  63. Simple view to echo back the content of uploaded files for tests.
  64. """
  65. def read_and_close(f):
  66. with f:
  67. return f.read().decode()
  68. r = {k: read_and_close(f) for k, f in request.FILES.items()}
  69. return JsonResponse(r)
  70. def file_upload_quota(request):
  71. """
  72. Dynamically add in an upload handler.
  73. """
  74. request.upload_handlers.insert(0, QuotaUploadHandler())
  75. return file_upload_echo(request)
  76. def file_upload_quota_broken(request):
  77. """
  78. You can't change handlers after reading FILES; this view shouldn't work.
  79. """
  80. response = file_upload_echo(request)
  81. request.upload_handlers.insert(0, QuotaUploadHandler())
  82. return response
  83. def file_upload_getlist_count(request):
  84. """
  85. Check the .getlist() function to ensure we receive the correct number of files.
  86. """
  87. file_counts = {}
  88. for key in request.FILES:
  89. file_counts[key] = len(request.FILES.getlist(key))
  90. return JsonResponse(file_counts)
  91. def file_upload_errors(request):
  92. request.upload_handlers.insert(0, ErroringUploadHandler())
  93. return file_upload_echo(request)
  94. def file_upload_filename_case_view(request):
  95. """
  96. Check adding the file to the database will preserve the filename case.
  97. """
  98. file = request.FILES['file_field']
  99. obj = FileModel()
  100. obj.testfile.save(file.name, file)
  101. return HttpResponse('%d' % obj.pk)
  102. def file_upload_content_type_extra(request):
  103. """
  104. Simple view to echo back extra content-type parameters.
  105. """
  106. params = {}
  107. for file_name, uploadedfile in request.FILES.items():
  108. params[file_name] = {k: v.decode() for k, v in uploadedfile.content_type_extra.items()}
  109. return JsonResponse(params)
  110. def file_upload_fd_closing(request, access):
  111. if access == 't':
  112. request.FILES # Trigger file parsing.
  113. return HttpResponse()