def response_for_download(report, cd_value='attachment'): """ Preparing response for downloading file Content-Disposition header field from http://tools.ietf.org/html/rfc2183 :param: report - instance of Report model :param: cd_value - Content Disposition Value: "attachment" - for download "inline" - for preview :return: HttpResponse with report.file and some parameters """ path = report.file.path fileExt = os.path.splitext(report.filename)[1] # [0] returns path+filename ct = get_mimeType().get(fileExt.lower(), "application/octet-stream") filename = report.filename cdv = '%s; ' % cd_value fn = 'filename="%s"; ' % transliterate(filename) fns = "filename*=utf-8''%s; " % urlquote(filename) md = 'modification-date="%s"; ' % report.uploaded_on response = HttpResponse(content_type=ct) # content = report.file.read() with open(path, 'rb') as file: content = file.read() # читаємо файл незалежно від report # (інакше при тестуванні не завжди # вдається видалити тимчасовий файл) response.write(content) response['Content-Disposition'] = cdv + fn + fns + md response['Content-Length'] = report.file.size return response
def response_for_download_zip(folder, maxFileSize = MAX_ZIP_FILE_SIZE): """ Preparing response for downloading zip-file, consist of all files in folder (without recursion!) Content-Disposition header field from http://tools.ietf.org/html/rfc2183 :param: folder - instance of Folder model :return: HttpResponse with zip file and some parameters Message in case of zip file overflow max size """ zipSubdir = folder.name zipFilename = "%s.zip" % folder.name sio = BytesIO() # Open StringIO to grab in-memory ZIP contents zipFile = zipfile.ZipFile(sio, "w") # The zip compressor zipFileSize = 0 msg = "" for report in Report.objects.filter(parent_id=folder.id): zipFileSize += report.file.size if zipFileSize > maxFileSize: msg = 'Завеликий zip. Решту файлів відкинуто' break filename = report.filename # "людська" назва файла filepath = report.file.name # шлях до файла на диску abs_path = os.path.join(MEDIA_ROOT, filepath) zipPath = os.path.join(zipSubdir, filename) # шлях в архіві zipFile.write(abs_path, zipPath) # add file to zip zipFile.close() # Must close zip for all contents to be written fileExt = ".zip" ct = get_mimeType().get(fileExt.lower(), "application/octet-stream") fn = ' filename="%s";' % transliterate(zipFilename) fns = " filename*=utf-8''%s;" % urlquote(zipFilename) # Grab ZIP file from in-memory, make response with correct MIME-type response = HttpResponse(sio.getvalue(), content_type=ct) response['Content-Disposition'] = 'attachment' + fn + fns response['Content-Length'] = len(sio.getbuffer()) return response, zipFilename, msg
def test_response_for_download_zip_gives_proper_value_3(self): file2 = SimpleUploadedFile("file2.txt", b"file_content") report2 = DummyFolder().create_dummy_report(self.root, file=file2) zipFilename = "%s.zip" % self.root.name fn = ' filename="%s";' % transliterate(zipFilename) fns = " filename*=utf-8''%s;" % urlquote(zipFilename) expected_content_disposition = 'attachment' + fn + fns resp, zipFilename, msg = response_for_download_zip(self.root, 15) self.assertEqual(zipFilename, 'Тека файлів.zip') self.assertEqual(msg, 'Завеликий zip. Решту файлів відкинуто') self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition) self.assertEqual(resp.get('Content-Length'), '232') self.assertEqual(resp.get('Content-Type'), 'application/zip') # self.assertEqual(resp.content, b'file_content') report2.file.delete()
def test_response_for_download_zip_gives_proper_value(self): zipFilename = "%s.zip" % self.root.name fn = ' filename="%s";' % transliterate(zipFilename) fns = " filename*=utf-8''%s;" % urlquote(zipFilename) expected_content_disposition = 'attachment' + fn + fns resp, zipFilename, msg = response_for_download_zip(self.root) self.assertEqual(zipFilename, 'Тека файлів.zip') self.assertEqual(msg, "") self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition) self.assertEqual(resp.get('Content-Length'), '232') self.assertEqual(resp.get('Content-Type'), 'application/zip') expected_namelist = ['Тека файлів/Текстовий файл.txt'] bio = BytesIO() # Open ByteIO to grab in-memory file bio.write(resp.content) # записуємо вміст у "файл" zipFile = zipfile.ZipFile(bio) # "файл" як zipfile self.assertIsNone(zipFile.testzip()) self.assertEqual(zipFile.namelist(), expected_namelist)
def test_response_for_download_gives_proper_value(self): filename = self.report.filename cd_value = "attachment" cdv = '%s; ' % cd_value fn = 'filename="%s"; ' % transliterate(filename) fns = "filename*=utf-8''%s; " % urlquote(filename) md = 'modification-date="%s"; ' % self.report.uploaded_on expected_content_disposition = cdv + fn + fns + md resp = response_for_download(self.report) self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition) self.assertEqual(resp.get('Content-Length'), '12') self.assertEqual(resp.get('Content-Type'), 'text/plain') self.assertEqual(resp.content, b'file_content') cd_value = "inline" cdv = '%s; ' % cd_value expected_content_disposition = cdv + fn + fns + md resp = response_for_download(self.report, cd_value=cd_value) self.assertEqual(resp.get('Content-Disposition'), expected_content_disposition)
def test_other_examples(self): for e in self.examples: ukr = e[0].strip() eng = e[1] trans = transliterate(ukr) self.assertEqual(trans, eng)