【问题标题】:Upload an image to server using chrome extensions使用 chrome 扩展将图像上传到服务器
【发布时间】:2017-03-15 07:11:08
【问题描述】:

我正在做一个能够从网页获取图像的 chrome 扩展,在我得到它之后,我正在尝试将其自动上传到 Intranet 服务器,而无需用户迭代。

我现在正在这样做。

这是在 Content_script.js 上

...
x = $(frame1).contents().find("#image");
chrome.extension.sendRequest(x[0].src);
...

这是在 background.js 上

chrome.extension.onRequest.addListener(function(links) {
      chrome.downloads.download( { url: links , 
      conflictAction: "overwrite", 
      filename: "get_image.jpg" }, 
      function(DescargaId) { 
            var formData = new FormData();
            formData.append("doc", Blob, "~/Downloads/get_image.jpg");
            var request = new XMLHttpRequest();
            request.open("POST", "http://192.168.0.30/app_get_pictures/upload_img.php");
            request.setRequestHeader("Content-Type", "multipart/form-data");
            request.send(formData);
} );

这个在upload_img.php

 ...
 $uploaddir = $_SERVER['DOCUMENT_ROOT'].'/app_get_pictures/images/';
 $uploadfile = $uploaddir . basename($_FILES['doc']['name']);
 move_uploaded_file($_FILES['doc']['tmp_name'], $uploadfile);
 ...

这样,我已经成功将图片下载到本地机器,但是无法上传图片到服务器。

可以这样做,或者即使我可以直接将图像上传到服务器,而无需先将其下载到本地机器。

注意:我在扩展解决方案的弹出页面上没有任何标签表单,我也没有弹出页面,因为正如我已经说过的,我不需要用户的任何迭代。

感谢您的帮助!

【问题讨论】:

  • 尝试直接将图像转换为 Blob,示例应该很容易谷歌搜索,你需要 manifest.json 的 "permissions" 中的 "<all_urls>"
  • 在大多数情况下,将图片URL发送到服务器,让服务器自己获取图片不是更高效吗?

标签: javascript php jquery file-upload google-chrome-extension


【解决方案1】:

感谢https://stackoverflow.com/users/934239/xan 我使用他的建议解决了这个问题,这是生成的工作代码。

    ...
    // With this I can download or get content image into var blob
    var xhr = new XMLHttpRequest();
    var kima = $(frame1).contents().find("#image");
    xhr.open('GET',kima[0].src,true);
    xhr.responseType = 'blob';

    xhr.onload = function(e) {
      if (this.status == 200) {
        var blob = new Blob([this.response], {type: 'image/png'});
        send_image(blob);
      }
    };

    xhr.send();
    ....

    // After the image is loaded into var blob, it can be send
    // to the server side
    function send_image(x){
         var formData = new FormData();
         formData.append("doc", x);

         var request = new XMLHttpRequest();
         request.open("POST", "http://192.168.0.30/app_get_image/upload_img.php");
         request.send(formData);
     }

所有这些代码都放入 chrome 扩展的 content_script 中。 也不再需要使用 API download 的后台代码。 希望这对其他人有用。

再次感谢。

【讨论】:

    【解决方案2】:

    除了downloads.download的回调并不表示文件已经下载(只是下载排队)..

    formData.append("doc", Blob, "~/Downloads/get_image.jpg");
    

    你认为这段代码有什么作用? Documentation,供参考。

    第二个参数应该是保存文件的数据;第三个参数只是用于命名匿名数据的文件名(例如在Blob中)

    相反,您传递Blob 对象本身;不是带有数据的Blob实例

    事实上,使用这种架构,您将无法上传文件,因为在任何时候chrome.downloads API 都不会让您访问文件的内容,并且您不能仅通过文件名访问磁盘上的文件(我认为您认为这段代码会这样做)。

    要实际访问数据,您需要自己使用 XHR(或者如果您想要“现代”,则使用 Fetch API)请求它。然后,您将获得可以request to be a Blob 的响应对象。然后,您可以上传 blob 调用 chrome.downloadscreateObjectURL 以从扩展程序的内存中“下载”它。

    【讨论】:

    • 感谢您的建议,但我也有这个东西。如果我的解释没有错,API 不允许我访问文件内容,那么唯一的方法是使用 XHR 上传文件,但是我可以将 XHR 放在内容脚本中还是背景脚本?,再次感谢。
    • “但是我可以将 XHR 放在哪里,在内容脚本或背景脚本中” 从 XHR 的角度来看 - 应该没关系,因为内容和背景脚本有相同级别的访问权限。但是要调用downloads API,它不能是内容脚本。
    • 似乎是不可能的。因为我已经从网页下载到本地机器,后台脚本中有downloads API,但无法上传到我的服务器。
    • 您无法访问下载的文件。完全没有。我建议的是一个两步过程:首先下载到内存(使用 XHR),然后将该副本从内存保存到两个地方(上传和downloads.download)。
    • 再次感谢您的快速回复。好的,我会先尝试用 XHR 下载,然后在内存中将它上传到我的服务器。我会尝试不使用downloads API。
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 2015-12-30
    • 2021-05-20
    相关资源
    最近更新 更多