【问题标题】:Dropzone.js How do I get an ID from the DB before a file is finished uploading?Dropzone.js 如何在文件上传完成之前从数据库中获取 ID?
【发布时间】:2021-07-15 21:28:05
【问题描述】:

我有一种情况,我尝试以各种方式解决,但对我没有用。

我需要的是,在开始上传视频时,我可以在数据库中创建一个 ID 并将其返回到 Dropzone sending event 以将其与其他表单字段一起发送。我需要 ID,因为在上传视频时,我必须显示保存在数据库中的内容的预览,并且用户可以修改视频的名称。

要在数据库中创建 ID,我有这个 Ajax 函数:

    function create() {
        var result;
        $.ajax({
            type: 'post',
            url: urlroot + 'Videos/id',
            data: {},
            success: function (response) {
                myCallback(response);
            }
        });
        return result;
    }

    function myCallback(response) {
        return response;
    }

这是 Dropzone 的发送事件:

    this.on("sending", function (file, xhr, formData) {
        var idv = create();
        formData.append("id", idv);
        formData.append("artistas", jQuery("#artistas").val());
        formData.append("artistas", jQuery("#artistas").val());
    });

问题是在发送事件执行之前$ajax响应没有到达,所以我的“idv”进入PHP脚本为“未定义”。我知道这是因为异步调用。我试图以某种方式延迟发送的执行(使用 promises 或 setTimeOut),但它不起作用。

我也试过直接在上传PHP脚本中创建,DB中的ID并用“return”或“echo”返回,但只能在“success”事件中收到答案,我需要你以便能够在上传到服务器时修改视频的名称。

我还尝试在“发送”事件中访问文件或 XHR 对象的数据,并使用 console.log 它向我显示 .responseText,但是当我想直接访问时它告诉我它是空的:

    console.log(file.xhr.responseText);
    console.log(xhr.responseText);

我不知道还能尝试什么,我需要该 ID 来在文件上传时修改数据库中的数据,因为视频的名称可以重复。也许我应该改变我的注意力,如果有人启发我,将不胜感激。

我很关注你们的cmets,对我的英语很抱歉。

【问题讨论】:

    标签: php dropzone.js


    【解决方案1】:

    您可以使用session_id() 来解决问题。

    <?php 
    session_start();
    $newkey=session_id();
    
    echo $newkey;
    
    //e.g. ml1n8oc46ma6kqndpok38mk661
    
    ?>
    

    第 1 步

    当用户访问您的网站时 --- 即使是他们通过 Dropzone 触发文件上传之前,系统也可以创建此 ID,以便您获得唯一的密钥。

    第二步

    当您上传文件时,请确保将此唯一键与文件名一起存储在 db 表中的新记录中(或对于多个文件上传,存储到新记录中)。确保您的 db 表有一个 auto_increment 键

    第三步

    现在您可以将session_id与您的数据库中的实际视频记录链接起来,请使用ajax返回所有记录的auto_incremented ID,然后您可以将它们以表格形式放入DIV,然后您可以修改视频文件名只需

    rename("/uploaded/video1.mp4","/uploaded/vidoe1_newname.mp4");
    

    当然我相信你还需要在文件重命名后更新你的数据库表,以便数据库数据与你重命名的文件名匹配。

    类似:

    $stmt = $this->mysqli->prepare("UPDATE uploadedfile SET filename=? WHERE id=? and session_id=?");
    $currentkey=session_id();
    $stmt->bind_param('sis', $newfilename, $id, $currentkey);
    
    // $id is the auto_incremented id returned from previous ajax 
    
    $stmt->execute();
    

    总结一下:

    1. 将多个文件上传到服务器
    2. 将文件上传数据保存到服务器,与session_id链接
    3. 使用 ajax 调用 PHP 以从所有上传的记录中检索 ID(例如 select * from uploadfile where session_id=?),然后您将获得可以进一步处理的记录的自动增量 ID。 (比如使用ajax返回并将其放入表格形式的DIV中,然后用户可以单击选择要重命名的照片等等)

    【讨论】:

    • 非常感谢您的回答。您建议的那个是一个不错的选择,问题是上传是多个,并且 Dropzone 允许您添加具有相同名称的文件。因此,如果我上传例如 10 个文件(其中 3 个具有相同名称),它们将在数据库中都包含相同的 session_id (),并且在执行 UPDATE UPDATE table SET name = 'new_name' WHERE ses_id = id AND name = 'old_name' 修改记录时我无法个性化 3
    • 是的,这就是我在上面第 3 点(最后一点)中指出的原因 - 我稍微添加了措辞以使其更清晰。您必须使用 ajax 来检索相同 session_id 的所有记录自动增量 ID,然后将它们放入 DIV 中的表格形式中,然后用户可以单击要重命名的照片。
    • 是的,现在我明白了。在 Dropzone 处理事件中,您可以调用在文件加载时构建编辑区域的 ajax 函数。我会试试的,谢谢你的想法
    • 太棒了。祝您编码愉快,度过愉快的一天。
    猜你喜欢
    • 2014-07-31
    • 2011-07-05
    • 2023-04-02
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多