Django:如何进行可疑文件操作/复制文件

我想做一个SuspiciousFileOperation默认情况下django不允许的操作。

我正在编写命令(通过运行manage.py importfiles),以便在Django的我自己编写的文件存储中将给定的目录结构导入真实文件系统中。

我认为,这是我的相关代码:

def _handle_directory(self, directory_path, directory):

for root, subFolders, files in os.walk(directory_path):

for filename in files:

self.cnt_files += 1

new_file = File(directory=directory, filename=filename, file=os.path.join(root, filename),

uploader=self.uploader)

new_file.save()

回溯是:

Traceback (most recent call last):

File ".\manage.py", line 10, in <module>

execute_from_command_line(sys.argv)

File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 399, in execute_from_command_line

utility.execute()

File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 392, in execute

self.fetch_command(subcommand).run_from_argv(self.argv)

File "C:\Python27\lib\site-packages\django\core\management\base.py", line 242, in run_from_argv

self.execute(*args, **options.__dict__)

File "C:\Python27\lib\site-packages\django\core\management\base.py", line 285, in execute

output = self.handle(*args, **options)

File "D:\Development\github\Palco\engine\filestorage\management\commands\importfiles.py", line 53, in handle

self._handle_directory(args[0], root)

File "D:\Development\github\Palco\engine\filestorage\management\commands\importfiles.py", line 63, in _handle_directory

new_file.save()

File "D:\Development\github\Palco\engine\filestorage\models.py", line 157, in save

self.sha512 = hashlib.sha512(self.file.read()).hexdigest()

File "C:\Python27\lib\site-packages\django\core\files\utils.py", line 16, in <lambda>

read = property(lambda self: self.file.read)

File "C:\Python27\lib\site-packages\django\db\models\fields\files.py", line 46, in _get_file

self._file = self.storage.open(self.name, 'rb')

File "C:\Python27\lib\site-packages\django\core\files\storage.py", line 33, in open

return self._open(name, mode)

File "C:\Python27\lib\site-packages\django\core\files\storage.py", line 160, in _open

return File(open(self.path(name), mode))

File "C:\Python27\lib\site-packages\django\core\files\storage.py", line 261, in path

raise SuspiciousFileOperation("Attempted access to '%s' denied." % name)

django.core.exceptions.SuspiciousFileOperation: Attempted access to 'D:\Temp\importme\readme.html' denied.

该完整的模型可以在GitHub上找到。在目前完整的命令是gist.github.com可用。

如果你不想检查模型file,则File该类的属性为FileField。

我想会发生此问题,因为我只是“链接”到找到的文件。但是我需要复制它,是吗?如何将文件复制到文件中?

回答:

分析堆栈跟踪的这一部分:

File "C:\Python27\lib\site-packages\django\core\files\storage.py", line 261, in path

raise SuspiciousFileOperation("Attempted access to '%s' denied." % name)

导致标准的Django FileSystemStorage。它期望文件位于你的MEDIA_ROOT。你的文件可以在文件系统中的任何位置,因此会发生此问题。

你应该传递类似文件的对象,而不是File模型的路径。最简单的方法是使用Django File类,该类是类似python文件的对象的包装。有关更多详细信息。

更新:

好的,我建议从文档中选择一条路线:

from django.core.files import File as FileWrapper

def _handle_directory(self, directory_path, directory):

for root, subFolders, files in os.walk(directory_path):

for filename in files:

self.cnt_files += 1

new_file = File(

directory=directory, filename=filename,

file=os.path.join(root, filename),

uploader=self.uploader)

with open(os.path.join(root, filename), 'r') as f:

file_wrapper = FileWrapper(f)

new_file = File(

directory=directory, filename=filename,

file=file_wrapper,

uploader=self.uploader)

new_file.save()

如果可行,则应将文件复制到secure_storage可调用对象提供的位置。

以上是 Django:如何进行可疑文件操作/复制文件 的全部内容, 来源链接: utcz.com/qa/411001.html

回到顶部