V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wxd92
V2EX  ›  Django

Django FileUpload 问题请教

  •  
  •   wxd92 · 2020-06-06 15:47:10 +08:00 · 3056 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用户上传文件( VUE )-> 存储相关信息至数据库 -> 计算文件其他相关参数如(size, length(语音时长)) -> 更新数据库

    数据库 Model: FileField, Size, Length

    我的问题是:
    因为必须等用户将文件传到目录下时,服务器端才能用得到的文件来计算相关参数,然后更新数据库

    如何得知文件已经传好了? 并立即更新数据库相关字段 (因为一开始文件并没有达到服务器端,所以一开始设置一个 default 值给 size, length; 等计算好了,再更新)
    11 条回复    2020-06-07 14:02:23 +08:00
    HuberyPang
        1
    HuberyPang  
       2020-06-06 16:35:46 +08:00 via Android   ❤️ 1
    文件上传时,前端可以获取文件的大小和类型,语音时常啥的就不清楚了。所以可以前端获取。
    后端处理,可以自己维护文件的保存,这样可以确保在获取文件信息时已经保存过文件了,可以直接在下面读取文件的信息, 注意下提交异常时,进行回滚,清除刚保存的文件就行了。
    wxd92
        2
    wxd92  
    OP
       2020-06-06 16:38:30 +08:00
    @HuberyPang 感谢, “可以自己维护文件的保存,这样可以确保在获取文件信息时已经保存过文件了” -》 这个可以详细说下吗? 自己维护文件的保存?
    HuberyPang
        3
    HuberyPang  
       2020-06-06 16:54:29 +08:00   ❤️ 1
    @wxd92 https://www.cnblogs.com/linxiyue/p/4038436.html 给你个参考连接 关键词 request.FILES
    zachlhb
        4
    zachlhb  
       2020-06-06 17:12:44 +08:00 via Android   ❤️ 1
    你拿到文件不得执行 io 写入,写入完成这还不知道么
    wxd92
        5
    wxd92  
    OP
       2020-06-06 17:29:46 +08:00
    @zachlhb 新手 ( 如何得知写入完成了呢?
    ericls
        6
    ericls  
       2020-06-06 18:28:25 +08:00 via iPhone   ❤️ 1
    用户不会传到你的目录 只会传给你 web server 你拿到 文件(file or file-like io object) 以后自己放到目录里的。 在你拿到文件的时候 你就知道大小了
    wxd92
        7
    wxd92  
    OP
       2020-06-06 19:10:23 +08:00
    @ericls 感谢 我想的是 在存到 database 之前 我需要获取文件,计算得到我需要的一些信息,如语音文件的时长,等, 拿来更新数据库
    fensou
        8
    fensou  
       2020-06-06 22:46:50 +08:00 via iPhone
    怠速抖动硬伤
    HashV2
        9
    HashV2  
       2020-06-07 02:01:45 +08:00   ❤️ 1
    我好像写过类似的
    我是直接在 model 下重写 save 方法做一些操作后再执行父类的 save 的:
    class DocumentModel(model):
    """
    字段定义略过
    """
    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
    # 大概是这样,具体忘了,这个节点是可以直接拿到 FileField 的文件内容的,怎么操作就随便了
    self.Size = self.FileField.size
    self.Length = XXXX
    super(DocumentModel, self).save()
    HashV2
        10
    HashV2  
       2020-06-07 02:03:15 +08:00   ❤️ 1
    @HashV2 我的缩进怎么都没了.... 反正大概就是这样 在写入数据库前就以可处理好相关参数再写入
    wxd92
        11
    wxd92  
    OP
       2020-06-07 14:02:23 +08:00
    感谢感谢 (又看了看文档 发现可以处理 temporyFile 的 TemporaryUploadedFile
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2799 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:01 · PVG 20:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.