8

我正在 Django 中构建一个网络应用程序。我有一个将文件发送到views.py 的表单。

意见:

@login_required(login_url=login_url)
def addCancion(request):
    if request.method == 'POST':
        form2 = UploadSong(request.POST, request.FILES)
        if form2.is_valid():
            if(handle_uploaded_song(request.FILES['file'])):
                path = '%s' % (request.FILES['file'])
                ruta =  "http://domain.com/static/canciones/%s" % path
                usuario = Usuario.objects.get(pk=request.session['persona'])
                song = Cancion(autor=usuario, cancion=ruta)
                song.save()
                return HttpResponse(ruta)
            else:
                return HttpResponse("-3")
        else:
            return HttpResponse("-2")
    else:
        return HttpResponse("-1")   

我试图只上传 MP3 文件,但我不知道如何制作这个过滤器。我尝试了一个名为“ContentTypeRestrictedFileField(FileField):”的类并且不起作用。

如何获取views.py 中的文件类型?

谢谢!

4

7 回答 7

16

您还可以使用表单中的 clean() 方法来验证它。因此,您可以拒绝不是 mp3 的文件。像这样的东西:

class UploadSong(forms.Form):
    [...]

    def clean(self):
        cleaned_data = super(UploadSong, self).clean()
        file = cleaned_data.get('file')

        if file:
            filename = file.name
            print filename
            if filename.endswith('.mp3'):
                print 'File is a mp3'
            else:
                print 'File is NOT a mp3'
                raise forms.ValidationError("File is not a mp3. Please upload only mp3 files")

        return file
于 2013-10-09T14:20:53.567 回答
6

import mimetypes, magic

mimetypes.MimeTypes().types_map_inv[1][
    magic.from_buffer(form.cleaned_data['file'].read(), mime=True)
][0]

例如,为您提供“.pdf”的扩展名

https://docs.djangoproject.com/en/dev/topics/forms/#processing-the-data-from-a-form
http://docs.python.org/2/library/mimetypes.html#mimetypes。 MimeTypes.types_map_inv
https://github.com/ahupp/python-magic#usage

于 2014-01-14T19:24:47.120 回答
5

获取直接请求:

import os


extesion = os.path.splitext(str(request.FILES['file_field']))[1]

或在 db - 模型中获得扩展。

import os

file = FileModel.objects.get(pk=1)  # select your object
file_path = file.db_column.path  # db_column how you save name of file.

extension = os.path.splitext(file_path)[1]
于 2018-03-28T18:19:18.997 回答
4

你是这个意思:

u_file = request.FILES['file']            
extension = u_file.split(".")[1].lower()

if(handle_uploaded_song(file)):
    path = '%s' % u_file
    ruta =  "http://example.com/static/canciones/%s" % path
    usuario = Usuario.objects.get(pk=request.session['persona'])
    song = Cancion(autor=usuario, cancion=ruta)
    song.save()
    return HttpResponse(content_type)
于 2013-04-12T16:57:57.797 回答
2

您可以使用request.FILES["file_field_name"].content_type

my_file = request.FILES["file_field_name"]
if my_file.content_type != 'text/csv':
    print("Your file must be a CSV type")

于 2021-04-15T04:18:13.077 回答
1

使用FileType.py库。

示例

kind = filetype.guess('tests/fixtures/sample.jpg')
if kind is None:
    print('Cannot guess file type!')
    return

print('File extension: %s' % kind.extension)
print('File MIME type: %s' % kind.mime)
于 2019-09-16T00:01:45.537 回答
0

使用MimeTypes().guess_extension()方法。检查下面的片段。

# guess the file extension
file_obj.seek(0)
mime = magic.from_buffer(file_obj.read(), mime=True)
extension = mimetypes.MimeTypes().guess_extension(mime)
>>> print extension
.jpeg
于 2020-01-03T09:53:04.280 回答