Django: How to allow a Suspicious File Operation / copy a file

后端 未结 4 559
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-04 01:54

I want to do a SuspiciousFileOperation which django disallows by default.

I am writing a command (to run via manage.py importfiles) to impo

4条回答
  •  不思量自难忘°
    2020-12-04 02:44

    Analyzing this part of stacktrace:

    File "C:\Python27\lib\site-packages\django\core\files\storage.py", line 261, in path
        raise SuspiciousFileOperation("Attempted access to '%s' denied." % name)
    

    leads to the standard Django FileSystemStorage. It expects files to be within your MEDIA_ROOT. Your files can be anywhere in the file system, therefore this problem occurs.

    You should pass file-like object instead of a path to your File model. The easiest way to achieve that would be to use Django File class, which is a wrapper around python file-like objects. See File object documentation for more details.

    Update:

    Ok, I am suggesting here a route taken from the docs:

    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()
    

    If it works it should copy the file to the location provided by your secure_storage callable.

提交回复
热议问题