相关疑难解决方法(0)

如何将InMemoryUploadedFile对象复制到磁盘

我试图捕获一个与表单一起发送的文件,并在保存之前对其执行一些操作.所以我需要在临时目录中创建此文件的副本,但我不知道如何到达它.Shutil的功能无法复制此文件,因为没有路径.那么有没有办法以其他方式进行此操作?

我的代码:

    image = form.cleaned_data['image']
    temp = os.path.join(settings.PROJECT_PATH, 'tmp')
    sourceFile = image.name # without .name here it wasn't working either
    import shutil
    shutil.copy(sourceFile, temp)
Run Code Online (Sandbox Code Playgroud)

哪个提出:

Exception Type: IOError at /
Exception Value: (2, 'No such file or directory')

调试:

#  (..)\views.py in function

  67. sourceFile = image.name
  68. import shutil
  69. shutil.copy2(sourceFile, temp) ...

# (..)\Python26\lib\shutil.py in copy2

  92. """Copy data and all stat info ("cp -p src dst").
  93.
  94. The destination may be a directory.
  95.
  96. """ …
Run Code Online (Sandbox Code Playgroud)

python django file-upload file-storage

37
推荐指数
4
解决办法
4万
查看次数

在表单的清理方法中读取文件数据

所以,我正在努力实现我之前的问题的答案.

这是我的模特:

class Talk(models.Model):
  title        = models.CharField(max_length=200)
  mp3          = models.FileField(upload_to = u'talks/', max_length=200)
Run Code Online (Sandbox Code Playgroud)

这是我的表格:

class TalkForm(forms.ModelForm):
  def clean(self):
    super(TalkForm, self).clean()
    cleaned_data = self.cleaned_data

    if u'mp3' in self.files:
      from mutagen.mp3 import MP3
      if hasattr(self.files['mp3'], 'temporary_file_path'):
        audio = MP3(self.files['mp3'].temporary_file_path())
      else:
        # What goes here?
        audio = None # setting to None for now
      ...
    return cleaned_data

  class Meta:
    model = Talk
Run Code Online (Sandbox Code Playgroud)

Mutagen在磁盘上需要类似文件的对象或文件名(我认为) - 第一种情况(上传的文件大于内存中处理的文件大小)工作正常,但我不知道如何处理InMemoryUploadedFile我得到的其他情况.我试过了:

# TypeError (coercing to Unicode: need string or buffer, InMemoryUploadedFile found) …
Run Code Online (Sandbox Code Playgroud)

django django-file-upload mutagen

16
推荐指数
1
解决办法
9440
查看次数

使用 commit=False 调用 save() 时未调用 Django 的 FileField“upload_to”方法

上下文:我想获取用户上传的文件,将其附加到模型,更改一些属性,然后将对象保存到数据库。

这是一些相关的代码:

模型.py

def file_upload_path(instance, filename):
    path = os.path.join('uploaded_files', str(uuid4()))
    return path 

class UploadedFile(models.Model):
    file_object = models.FileField(null=False, blank=False,
                                   upload_to=file_upload_path)

    def __unicode__(self):
        return self.file_object.name
Run Code Online (Sandbox Code Playgroud)

表格.py

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadedFile
        fields = ['file_object']
Run Code Online (Sandbox Code Playgroud)

视图.py

def home(request):
...
        if form.is_valid():
            new_file = form.save(commit=True)

            print new_file
...
Run Code Online (Sandbox Code Playgroud)

这段代码准确地打印出我想要的内容,即调用upload_to 并将文件保存到所述位置后的文件路径(例如“uploaded_files/b992e44e-6403-4c37-82b4-b3c403d07f79”)。

现在,有了这个 views.py,事情发生了变化:

视图.py

def home(request):
...
        if form.is_valid():
            new_file = form.save(commit=False)

            print new_file

            # new_file_object = FileObject(os.path.abspath(new_file.file_object.url))
            # new_file.mime_type = new_file_object.get_mime_type()
...
Run Code Online (Sandbox Code Playgroud)

我得到的不是路径,而是原始文件名(例如“jnes.exe”),因此我无法处理该文件,因此我可以获取其 mime 类型,例如,然后更新模型并将其保存到数据库中。

任何想法我做错了什么?谢谢。

我是如何解决它的:

我对仍在内存中/临时在磁盘上的文件进行必要的模型编辑,因为 Django 不允许您在实际保存新模型实例之前直接找到 FileField 的位置。 …

python django

5
推荐指数
1
解决办法
1217
查看次数