当前位置: 首页 > 面试题库 >

通过chrome扩展名将文件上传为表单数据

宋典
2023-03-14
问题内容

我通过chrome扩展名将文件上传为表单数据,我的代码如下。这里的问题是文件浏览窗口仅打开一秒钟,然后消失。
该问题仅出现在Mac OS中。

manifest.json:

"background": {
  "scripts": ["jszip.js", "background.js"]
},

background.js:

chrome.runtime.onMessage.addListener(function (msg) {
  if (msg.action === 'browse')
  {
    var myForm=document.createElement("FORM");
    var myFile=document.createElement("INPUT");
    myFile.type="file";
    myFile.id="selectFile";
    //myFile.onclick="openDialog()";
    myForm.appendChild(myFile);
    var myButton=document.createElement("INPUT");
    myButton.name="submit";
    myButton.type="submit";
    myButton.value="Submit";
    myForm.appendChild(myButton);
    document.body.appendChild(myForm);
  }
});

popup.js:

window.onload = function () {
  chrome.runtime.sendMessage({
    action: 'browse'
  });
}

问题答案:

一点“背景故事”:

您想让用户从弹出窗口中选择并上传文件。但是在OSX中,一旦打开文件选择器对话框,弹出窗口便失去焦点并关闭,从而导致其JS上下文也被破坏。因此,对话框打开并立即关闭。

这是MAC上的一个
已知错误
,已有一段时间了。

解决方案:

您可以将对话框打开逻辑移动到背景页面,而不受焦点丢失的影响。您可以从弹出窗口向后台页面发送一条消息,请求启动浏览和上传过程(请参见下面的示例代码)。

manifest.json

{
    ...
    "background": {
        "persistent": false,
        "scripts": ["background.js"]
    },

    "browser_action": {
        "default_title": "Test Extension",
//        "default_icon": {
//            "19": "img/icon19.png",
//            "38": "img/icon38.png"
//        },
        "default_popup": "popup.html"
    },

    "permissions": [
        "https://www.example.com/uploads"
        // The above permission is needed for cross-domain XHR
    ]
}

popup.html

    ...
    <script src="popup.js"></script>
</head>
<body>
    <input type="button" id="button" value="Browse and Upload" />
    ...

popup.js

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('button').addEventListener('click', function () {
        chrome.runtime.sendMessage({ action: 'browseAndUpload' });
        window.close();
    });
});

background.js

var uploadUrl = 'https://www.example.com/uploads';

/* Creates an `input[type="file]` */
var fileChooser = document.createElement('input');
fileChooser.type = 'file';
fileChooser.addEventListener('change', function () {
    var file = fileChooser.files[0];
    var formData = new FormData();
    formData.append(file.name, file);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', uploadUrl, true);
    xhr.addEventListener('readystatechange', function (evt) {
        console.log('ReadyState: ' + xhr.readyState,
                    'Status: ' + xhr.status);
    });

    xhr.send(formData);
    form.reset();   // <-- Resets the input so we do get a `change` event,
                    //     even if the user chooses the same file
});

/* Wrap it in a form for resetting */
var form = document.createElement('form');
form.appendChild(fileChooser);

/* Listen for messages from popup */
chrome.runtime.onMessage.addListener(function (msg) {
    if (msg.action === 'browseAndUpload') {
        fileChooser.click();
    }
});

注意 为了安全起见,fileChooser.click() 只有 在用户互动的情况下,Chrome才会执行。
在上面的示例中,用户单击弹出窗口中的按钮,该按钮将消息发送到调用的后台页面fileChooser.click();。如果您尝试以编程方式调用它,则将无法使用。(例如,在文档加载时调用它不会有任何效果。)



 类似资料:
  • 问题内容: 我正在将图像上传到servlet。通过检查文件头中的幻数,仅在服务器端验证上传的文件是否为图像。在将表单提交给Servlet之前,有什么方法可以在客户端验证扩展?我一按回车就开始上传。 我在客户端使用Javascript和jQuery。 更新: 我最终通过服务器端验证结束了工作,该验证读取字节,如果不是图像,则拒绝上传。 问题答案: 可以仅检查文件扩展名,但是用户可以轻松地将virus

  • 我已经创建了一个chrome扩展来学习英语,它可以构建一个包含源代码/翻译等的词典。 现在,我想将这个“文件”(我将/会用字典条目构建一个“文件”)发送到Google Drive,并在我的Android应用程序中使用这个文件。 但我不想将此文件保存在我的个人驱动器帐户中,而是保存在当前用户的驱动器中,即使用chrome扩展名的用户(当然,如果该用户有驱动器帐户)。 在我找到的所有例子中,他们为“我

  • 我正在创建一个Zend Framework应用程序,用户可以在其中上载配置文件图像。可接受的文件类型为png、jpg和gif。图像最终被存储为用户id和文件扩展名。 我想知道的是,假设用户上传png或gif文件,将文件扩展名更改为jpg是否安全? 这样,所有的配置文件图像都将具有相同的文件扩展名,我只是不确定这样更改文件类型是否是一个好主意。

  • 本文向大家介绍如何通过java获取文件名和扩展名,包括了如何通过java获取文件名和扩展名的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何通过java获取文件名和扩展名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 如:文件filePath = "E:\\test\\test.dxf" 1.获取文件名 eg:获取 test.dxf

  • 我正在使用Android中的PhoneGap从画廊上传图像,但我想做的是获取文件名及其扩展名,我无法从imageuri获取该文件名和扩展名,所以有人能告诉我如何找到吗 我的是所以有没有办法通过使用这个来获取fileEntry并读取文件名和扩展名?

  • 问题 你需要向C库函数传递文件名,但是需要确保文件名根据系统期望的文件名编码方式编码过。 解决方案 写一个接受一个文件名为参数的扩展函数,如下这样: static PyObject *py_get_filename(PyObject *self, PyObject *args) { PyObject *bytes; char *filename; Py_ssize_t len; i