【问题标题】:JavaScript FileReader Massive ResultJavaScript FileReader 大量结果
【发布时间】:2017-10-09 21:54:34
【问题描述】:

我有一个 FileReader,它可以让用户将文件(图像)上传到我的网站。

这是读取的代码:

$("input[type='file']").change(function(e) {

    var buttonClicked = $(this);

    for (var i = 0; i < e.originalEvent.srcElement.files.length; i++) {

        var file = e.originalEvent.srcElement.files[i];

        var img = document.createElement("img");
        var reader = new FileReader();
        reader.onloadend = function() {
            img.src = reader.result;                

            console.log(reader.result);

        }
        reader.readAsDataURL(file);
    }
});

一切都很好,直到我尝试打印出我的结果。例如,我使用了这个文件:

当我console.log() 结果时,它会吐出超过 95000 个字符。

特别是这张图片与我将接受进入我的网站的图片大小大致相同。

我也希望将这些图像存储在数据库中,所以我想知道如何使用非常长的图像源来实现这一点。有没有办法缩短它或以不同的方式获取图像路径?

我很好奇为什么它们这么长,但如果有人有存储这些(每个用户 100 个,500 多个用户)的提示,那就太好了!

谢谢-

【问题讨论】:

    标签: javascript file filereader reader


    【解决方案1】:

    将文件存储为...文件。

    需要FileReader的toDataURL()方法的用例很少,所以每次使用时,都应该问问自己为什么需要它。

    在你的情况下:

    • 在页面中显示图像。 不要为此使用 FileReader,而是以 url 的形式创建一个指向文件的直接指针,该文件仅适用于该会话。这可以通过URL.createObjectURL(File_orBlob) 方法实现。
    • 将此图像存储在您的服务器上。不要存储~37% bigger base64 version,将文件作为文件(多部分)直接发送和存储。这可以通过FormData API 轻松实现。

    inp.onchange = function(){
      var file = this.files[0];
      if(file.type.indexOf('image/') !== 0){
        console.warn('not an image');
        }
      var img = new Image();
      img.src = URL.createObjectURL(file);
      // this is not needed in this case but still a good habit
      img.onload = function(){
        URL.revokeObjectURL(this.src);
        };
      document.body.appendChild(img);
      }
    
    // not active but to give you da codez
    function sendToServer(){
      var file = inp.files[0];
      var form = new FormData();
      // here 'image' is the parameter name where you'll retrieve the file from in the request
      form.append('image', file); 
      form.append('otherInfo', 'some other infos');
      var xhr = new XMLHttpRequest();
      xhr.open('post', 'yourServer/uploadPage')
      xhr.onload = function(){
        console.log('saved');
        };
      xhr.send(form);
      }
    &lt;input type="file" id="inp"&gt;

    如果你需要 PHP 代码来检索文件表单这个请求:

    if ( isset( $_FILES["image"] ) ){
      $dir = 'some/dir/';
      $blob = file_get_contents($_FILES["image"]['tmp_name']);
      file_put_contents($dir.$_FILES["image"]["name"], $blob);
    }
    

    【讨论】:

    • 太好了,有机会我会试一试,这更有意义。谢谢。
    • 这很好用,但是,我试图在客户端保存这个 url,但它是一个 blob,它的生命周期只是会话。有没有其他方法可以产生不是 blob 并且可以存储的短路径?甚至是 Blob 存储?
    • @Sean 是 IndexedDb 可以将二进制文件存储在客户端的硬盘中。
    • @Kaiido 完美!非常感谢
    【解决方案2】:

    您需要将文件上传到某种服务器(为您的 javascript 提供服务的后端),然后从那里开始

    1. 验证文件
    2. 将文件存储在某处的物理服务器(或云)上
    3. 在数据库中添加一个条目,将上传文件的文件路径或 ID 与刚刚上传文件的用户相关联(以便您以后可以在需要时检索它)

    因此,基本上,您不会将图像存储在数据库中,而是将其存储在某个文件共享/云主机上,而您只存储稍后下载/检索图像所需的内容。

    【讨论】:

    • 这可以通过主机实现吗?即,如果我的网站是通过 godaddy/namecheap 等托管的,这还有可能吗?
    • 所以这两个例子只是域名提供商。要托管您的网站,您需要一个虚拟主机。在购买任何东西之前,您可以(并且应该)首先在本地完成所有这些工作。您需要后端技术(ASP、PHP、Node、Python、Ruby 等),然后您需要将请求从您的 javascript 发送到服务器,服务器将处理它并执行需要。
    • 对不起,我最初误解了。我已经有了主机,并且正在使用 PHP。我想我对“将请求从您的 javascript 发送到服务器”的意思有点困惑。我已经处理了大量的 POST 请求,所以我不确定处理这些图像的不同/工作方式。抱歉,如果我没有抓住重点,之前没有处理过用户上传!
    • @Kaiido 的回答是将图像发送到服务器的一种方式。在他的用例中,您创建一个FormData javascript 对象,将文件附加到它,然后将其上传到您的服务器您需要做的是在服务器上处理它并执行我在答案中列出的事情。
    • 太好了,我想我现在明白了。感谢您的帮助!
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多