views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. response = None
  50. # Check to make sure the exotic characters are preserved even
  51. # through file save.
  52. uni_named_file = request.FILES['file_unicode']
  53. obj = FileModel.objects.create(testfile=uni_named_file)
  54. full_name = '%s/%s' % (UPLOAD_TO, uni_named_file.name)
  55. if not os.path.exists(full_name):
  56. response = HttpResponseServerError()
  57. # Cleanup the object with its exotic file name immediately.
  58. # (shutil.rmtree used elsewhere in the tests to clean up the
  59. # upload directory has been seen to choke on unicode
  60. # filenames on Windows.)
  61. obj.delete()
  62. os.unlink(full_name)
  63. if response:
  64. return response
  65. else:
  66. return HttpResponse()
  67. def file_upload_echo(request):
  68. """
  69. Simple view to echo back info about uploaded files for tests.
  70. """
  71. r = {k: f.name for k, f in request.FILES.items()}
  72. return JsonResponse(r)
  73. def file_upload_echo_content(request):
  74. """
  75. Simple view to echo back the content of uploaded files for tests.
  76. """
  77. def read_and_close(f):
  78. with f:
  79. return f.read().decode()
  80. r = {k: read_and_close(f) for k, f in request.FILES.items()}
  81. return JsonResponse(r)
  82. def file_upload_quota(request):
  83. """
  84. Dynamically add in an upload handler.
  85. """
  86. request.upload_handlers.insert(0, QuotaUploadHandler())
  87. return file_upload_echo(request)
  88. def file_upload_quota_broken(request):
  89. """
  90. You can't change handlers after reading FILES; this view shouldn't work.
  91. """
  92. response = file_upload_echo(request)
  93. request.upload_handlers.insert(0, QuotaUploadHandler())
  94. return response
  95. def file_upload_getlist_count(request):
  96. """
  97. Check the .getlist() function to ensure we receive the correct number of files.
  98. """
  99. file_counts = {}
  100. for key in request.FILES:
  101. file_counts[key] = len(request.FILES.getlist(key))
  102. return JsonResponse(file_counts)
  103. def file_upload_errors(request):
  104. request.upload_handlers.insert(0, ErroringUploadHandler())
  105. return file_upload_echo(request)
  106. def file_upload_filename_case_view(request):
  107. """
  108. Check adding the file to the database will preserve the filename case.
  109. """
  110. file = request.FILES['file_field']
  111. obj = FileModel()
  112. obj.testfile.save(file.name, file)
  113. return HttpResponse('%d' % obj.pk)
  114. def file_upload_content_type_extra(request):
  115. """
  116. Simple view to echo back extra content-type parameters.
  117. """
  118. params = {}
  119. for file_name, uploadedfile in request.FILES.items():
  120. params[file_name] = {k: v.decode() for k, v in uploadedfile.content_type_extra.items()}
  121. return JsonResponse(params)
  122. def file_upload_fd_closing(request, access):
  123. if access == 't':
  124. request.FILES # Trigger file parsing.
  125. return HttpResponse()