在上传之前预览图像

IT技术 javascript jquery file-upload
2020-12-11 16:16:12

我希望能够在上传之前预览文件(图像)。预览动作应该全部在浏览器中执行,不使用 Ajax 上传图像。

我怎样才能做到这一点?

6个回答

imgInp.onchange = evt => {
  const [file] = imgInp.files
  if (file) {
    blah.src = URL.createObjectURL(file)
  }
}
<form runat="server">
  <input accept="image/*" type='file' id="imgInp" />
  <img id="blah" src="#" alt="your image" />
</form>

我做了一个ReactJS 实现奇迹般有效。@kxc 您应该进行 ajax 调用并input.files[0]作为数据发送请参阅 jQuery 的文档
2021-02-07 16:16:12
如果上传后没有选择文件怎么办?\
2021-02-12 16:16:12
@EasyBB 更改图像方向后,如何将其替换为实际上传的图像?我只得到旧图像。
2021-02-14 16:16:12
Internet Explorer 版本20H2evt =>是错误的语法 :(。
2021-02-18 16:16:12

有几种方法可以做到这一点。最有效的方法是使用URL.createObjectURL()文件从你的<input> 将此 URL 传递给img.src以告诉浏览器加载提供的图像。

下面是一个例子:

<input type="file" accept="image/*" onchange="loadFile(event)">
<img id="output"/>
<script>
  var loadFile = function(event) {
    var output = document.getElementById('output');
    output.src = URL.createObjectURL(event.target.files[0]);
    output.onload = function() {
      URL.revokeObjectURL(output.src) // free memory
    }
  };
</script>

您还可以使用FileReader.readAsDataURL()来解析 <input> 中的文件。这将在内存中创建一个包含图像的 base64 表示的字符串。

<input type="file" accept="image/*" onchange="loadFile(event)">
<img id="output"/>
<script>
  var loadFile = function(event) {
    var reader = new FileReader();
    reader.onload = function(){
      var output = document.getElementById('output');
      output.src = reader.result;
    };
    reader.readAsDataURL(event.target.files[0]);
  };
</script>

为避免内存问题,您应该URL.revokeObjectURL在完成 blob 后调用
2021-02-09 16:16:12
关于你的第一条评论@tfmontague。你确定吗?我只是在使用 readAsDataURL 后复制了 bese64 字符串并在另一个浏览器中打开它并且它工作正常。
2021-02-12 16:16:12
@Apolo 不在这种情况下,请参阅此答案:stackoverflow.com/a/49346614/2313004
2021-02-16 16:16:12
仔细阅读:当使用文件输入上传图像时,它会存储在浏览器的缓存中。URL.createObjectURL()会创建浏览器链接到缓存的图像。要创建可以存储在数据库中的文件的 base64 字符串,请使用readAsDataURL.
2021-02-25 16:16:12
@Lonel Lupu - 相信我的回答是错误的!还使用readAsDataURL并能够将 base64 字符转换为图像。
2021-03-03 16:16:12

单线解决方案:

下面的代码使用对象 URL,它比数据 URL 更有效地查看大图像(数据 URL 是一个包含所有文件数据的巨大字符串,而对象 URL 只是一个引用文件数据的短字符串 -记忆):

<img id="blah" alt="your image" width="100" height="100" />

<input type="file" 
    onchange="document.getElementById('blah').src = window.URL.createObjectURL(this.files[0])">

生成的 URL 将类似于:

blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345
@pheianox 这取决于你,因为这不是什么大问题。“当文档被卸载时,浏览器将自动释放对象 URL;但是,为了获得最佳性能和内存使用,如果有可以明确卸载它们的安全时间,你应该这样做”。有关更多信息MDN 参考
2021-02-10 16:16:12
这个解决方案对我不起作用。图像预览未显示。
2021-02-12 16:16:12
@Raptor等特点,是整个文件API ...( FileReaderinput.files等等)URL.createObjectURL是用户提交的文件打交道时的路要走,它仅创建一个内存中的符号链接到真正的文件用户的磁盘上。
2021-02-15 16:16:12
美丽的。但是如何清除内存使用URL.revokeObjectURL():D
2021-02-18 16:16:12
@cnlevy 我们如何访问上传的文件?是否只能从您提到的 URL 中获取它?具体来说,我正在使用已经支持访问上传文件的flask。这种单线还有其他方法吗?
2021-02-25 16:16:12

这是最简单的方法


在不使用 Ajax 或任何复杂功能的情况下从浏览器将图像上传到服务器之前预览图像。


它需要一个“ onChange ”事件来加载图像。

function preview() {
    frame.src=URL.createObjectURL(event.target.files[0]);
}
<form>
  <input type="file" onchange="preview()">
  <img id="frame" src="" width="100px" height="100px"/>
</form>

要预览多张图像,请单击此处

重要提示:如果/当使用此方法时,有必要删除对象 URL 以防止内存泄漏。这是通过调用 来完成的URL.revokeObjectURL(myObjectUrl),其中myObjectUrl创建了对象 URL(这意味着您需要在设置图像 src 之前将对象 URL 分配给一个临时变量)。请参阅developer.mozilla.org/en-US/docs/Web/API/URL/...
2021-02-10 16:16:12

LeassTaTT 的答案在 FF 和 Chrome 等“标准”浏览器中运行良好。IE 的解决方案存在但看起来不同。这里是跨浏览器解决方案的描述:

在HTML中,我们需要两个预览元素,img用于标准的浏览器和div用于IE

HTML:

<img id="preview" 
     src="" 
     alt="" 
     style="display:none; max-width: 160px; max-height: 120px; border: none;"/>

<div id="preview_ie"></div>

在 CSS 中,我们指定了以下 IE 特定的东西:

CSS:

#preview_ie {
  FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)
}  

在 HTML 中,我们包含标准和特定于 IE 的 Javascript:

<script type="text/javascript">
  {% include "pic_preview.js" %}
</script>  
<!--[if gte IE 7]> 
<script type="text/javascript">
  {% include "pic_preview_ie.js" %}
</script>

pic_preview.js是 LeassTaTT 答案中的 Javascript。替换 $('#blah')whith$('#preview')并添加$('#preview').show()

现在是 IE 特定的 Javascript (pic_preview_ie.js):

function readURL (imgFile) {    
  var newPreview = document.getElementById('preview_ie');
  newPreview.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = imgFile.value;
  newPreview.style.width = '160px';
  newPreview.style.height = '120px';
}    

那是。适用于 IE7、IE8、FF 和 Chrome。请在IE9中测试并报告。IE预览的想法在这里找到:http : //forums.asp.net/t/1320559.aspx

http://msdn.microsoft.com/en-us/library/ms532969(v=vs.85).aspx