Django文件上传(获取文件DATA,而不仅仅是文件路径)

时间:2019-04-23 07:50:57

标签: django python-3.x

我想将管理Django表单上传到gcloud。我的gcloud部分可以工作,但是需要一个文件路径。我想从表单上传中访问文件的原始数据,并将其提供给gcloud的blob上传。

我有一个看起来像这样的模型

from django.db import models
from gcloud import storage
from oauth2client.service_account import ServiceAccountCredentials

# Create your models here.
class TestFile(models.Model):
    name = models.CharField(max_length=64,
        # NOT NULL, UNIQUE, no default.
        null=False, default=None, blank=False, unique=True
    )
    data = models.FileField()
    img_src = models.CharField(max_length=255,
        null=True, default=None, blank=True
    )
    def save(self, *args, **kwargs):
        super(TestFile, self).save(*args, **kwargs)
        filename = self.data.url
        print("FILENAME: " + filename)
        # How do I get the file DATA

我也有这样的管理表。

from django.contrib import admin
from django.utils.safestring import mark_safe

from .models import TestFile

class TestFileAdmin(admin.ModelAdmin):
        list_display = ( 
                "data",
                "name",
                "_img_src",
        )   
        def _img_src(self, obj):
                return mark_safe(u'<img style="height: 75px;width: 75px;object-fit: cover;" src="%s"/>' % obj.img_src)
admin.site.register(TestFile, TestFileAdmin)

使用我想要的任何存储后端,我都有一些这样的示例代码:

from gcloud import storage
from oauth2client.service_account import ServiceAccountCredentials
import os

credentials_dict = { 
        "type": "service_account",
        "client_id": os.environ["BACKUP_CLIENT_ID"],
        "client_email": os.environ["BACKUP_CLIENT_EMAIL"],
        "private_key_id": os.environ["BACKUP_PRIVATE_KEY_ID"],
        "private_key": os.environ["BACKUP_PRIVATE_KEY"],
}

credentials = ServiceAccountCredentials.from_json_keyfile_dict(
        credentials_dict
)
client = storage.Client(credentials=credentials, project="aerobic-copilot-232607")
bucket = client.get_bucket("tgtree")
blob = bucket.blob("temp.png")
blob.upload_from_filename("./temp.png")
# How to I upload from DATA?
url = blob.public_url
print(url)

问题:

如何拦截save()函数并从self.data获取实际字节数据?

完成此操作后,将其通过管道传递到blob.upload的blob函数是什么?

如果未动态键入python,则很容易看到适合的位置,但不适合。

1 个答案:

答案 0 :(得分:2)

您将以 self.data.read()
的形式获取数据
示例:

def save(self, *args, **kwargs):
    super(TestFile, self).save(*args, **kwargs)
    filename = self.data.url
    print("FILENAME: " + filename)
    data_in_bytes = self.data.read()

参考class FieldFile