Я пытался разработать «передовой» способ управления загрузкой файлов с помощью Turbogears 2 и до сих пор не нашел никаких примеров. Я нашел способ загрузить файл, но не уверен, насколько он надежен.
Кроме того, как лучше получить имя загруженного файла?
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
file.filename.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = self.request.params["file"].filename
permanent_file.close()
Итак, если я правильно понимаю, может ли что-то подобное избежать основной проблемы «именования»? id = UUID.
file = request.POST['file']
permanent_file = open(os.path.join(asset_dirname,
id.lstrip(os.sep)), 'w')
shutil.copyfileobj(file.file, permanent_file)
file.file.close()
this_file = file.filename
permanent_file.close()
uuid1().hex
илиuuid4().hex
решит проблему именования и большинство проблем с безопасностью. Вам не нужно вызыватьlstrip()
для uuid (не используйтеid
в качестве имени переменной - он маскирует встроеннуюid()
). Итак, используйтеuuid
, чтобы сгенерировать уникальное имя и скопировать загруженные данные в файл с таким именем в вашем каталоге загрузки. Если вам нужно сохранить имя файла, указанное пользователем, сохраните его как метаданные, возможно, в своей базе данных. Вы столкнетесь с дополнительными проблемами безопасности, некоторые из которых описаны здесь: scanit.be/uploads/php-file-upload.pdf - person mhawke   schedule 08.03.2010uuid4().hex
иstr(uuid4())
более или менее одинаковы. Я не вижу никаких преимуществ в наличии независимых UUID для URL-адреса и имени файла, поскольку теперь вам понадобится дополнительный слой для сопоставления UUID в URL-адресе с фактическим файлом. - person mhawke   schedule 09.03.2010