当前位置: 首页 > 面试题库 >

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

邓欣可
2023-03-14
问题内容

我想做一个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可调用对象提供的位置。



 类似资料:
  • 你可以使用复制任务( Copy )去复制文件. 复制任务扩展性很强,能够过滤复制文件的内容, 映射文件名. 使用复制任务时需要提供想要复制的源文件和一个目标目录,如果你要指定文件被复制时的转换方式,可以使用 复制规则. 复制规则被 CopySpec 接口抽象,复制任务实现了这个接口. 使用 CopySpec.from() 方法指定源文件.使用 CopySpec.into() 方法指定目标目录. 例

  • 问题内容: 我有一个包含两个简单的Java swing文件的程序。 如何为程序制作可执行的jar文件? 问题答案: jar文件只是包含Java文件集合的文件。为了使jar文件可执行,你需要指定 Class在jar文件中的位置。示例代码如下。 编译你的类。要制作一个jar,你还需要创建一个清单文件()。例如, 将编译后的输出类文件(JarExample.class,JarExample $ 1.cl

  • 问题内容: 我为dlopen编写了一个程序 但我收到“分段错误”错误,我使用.so库测试了该程序,它可以工作,但无法使其自身运行 问题答案: 您需要编写代码: 仔细阅读dlopen(3),始终检查那里的&函数是否成功,并在失败时使用。 并用编译上面的文件 不要忘记获得所有警告和标志(以便能够将自己的符号放入动态表中)。 在我的Debian / Sid / x86-64系统上(版本4.8.2和版本2

  • vendor 文件是什么? 任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。 如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。 它是如何定义的? 它是通过将 bin 键添加到项目中来定义的 composer.json。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。 { "bi

  • 你好我仍在学习如何编写代码,但在这个问题上遇到了一些困难: 用Java创建一个程序,读取CSV文件,并使用以下计算方法计算学生的最终分数:实验练习*30%长测验*30%备选评估*40%=最终分数然后,显示每个学生的最终分数。 我们将使用java.io包,到目前为止,这是我想出的 我知道有很多缺失的代码,但这是我所能做的一切,用我的知识和能力。我希望你们能帮我,也许能给我一些建议!非常感谢。

  • 我有一些c文件和.h头文件。现在我必须从这个.c和.h文件中创建.so文件。我怎么做?