Xem trước một hình ảnh trước khi nó được tải lên


1614

Tôi muốn có thể xem trước một tập tin (hình ảnh) trước khi nó được tải lên. Hành động xem trước phải được thực hiện tất cả trong trình duyệt mà không cần sử dụng Ajax để tải lên hình ảnh.

Tôi có thể làm cái này như thế nào?


Lưu ý rằng trừ khi bạn sử dụng Gears hoặc plugin khác, bạn không thể thao tác hình ảnh bên trong trình duyệt: code.google.com/p/chromium/issues/detail?id=32276
Steve-o

Hãy xem cách tiếp cận JavaScript thuần túy này, bao gồm câu trả lời của nó và có nhận xét của Ray Nicholus cho giải pháp cuối cùng: stackoverflow.com/questions/16430016/ trên
Jonathan Root

Dưới đây là một bài viết chi tiết đẹp với codepedia
Satinder singh

8
Đây là một giải pháp đơn giản không sử dụng jquery: developer.mozilla.org/en-US/docs/Web/API/FileReader/
Kẻ

Câu trả lời:


2535

Xin hãy xem mã mẫu dưới đây:

function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();
    
    reader.onload = function(e) {
      $('#blah').attr('src', e.target.result);
    }
    
    reader.readAsDataURL(input.files[0]); // convert to base64 string
  }
}

$("#imgInp").change(function() {
  readURL(this);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form runat="server">
  <input type='file' id="imgInp" />
  <img id="blah" src="#" alt="your image" />
</form>

Ngoài ra, bạn có thể thử mẫu này ở đây .


5
Bạn có thể cải thiện hiệu suất một chút bằng cách xác định trình đọc một lần. jsfiddle.net/LvsYc/638
Jaider

84
Tại sao nên sử dụng jQuery cho `$ ('# blah'). Attr ('src', e.target.result);` khi bạn có thể thực hiện một cách đơn giảndocument.getElementById('blah').src=e.target.result)
EasyBB

4
Tôi đã thực hiện ReactJS về việc này . Hoạt động như một lá bùa. @kxc bạn nên thực hiện cuộc gọi ajax và gửi input.files[0]dưới dạng dữ liệu, xem tài liệu của jQuery .
Sumi Straessle

@IvanBaev input.files[0]không có đường dẫn đầy đủ. Làm thế nào để FileReader xác định vị trí tệp?
Geezer cũ

4
Không quan trọng, bất cứ khi nào bạn không thể sử dụng jquery vì nó bị phồng lên và vanilla sẽ cho bạn kết quả nhanh hơn đặc biệt là nếu bạn có hàng tấn tập lệnh.
EasyBB

357

Có một vài cách bạn có thể làm điều này. Cách hiệu quả nhất là sử dụng URL.createObjectURL () trên Tệp từ <input> của bạn . Truyền URL này tới img.src để báo cho trình duyệt tải hình ảnh được cung cấp.

Đây là một ví dụ:

<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>

Bạn cũng có thể sử dụng FileReader.readAsDataURL () để phân tích tệp từ <input> của bạn. Điều này sẽ tạo ra một chuỗi trong bộ nhớ chứa một đại diện cơ sở của hình ảnh.

<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>


40
Đọc kỹ: readAsDataURL và createdObjectURL sẽ lưu trữ một hình ảnh trong trình duyệt, sau đó trả về một chuỗi được mã hóa base64 tham chiếu vị trí hình ảnh trong bộ đệm. Nếu bộ nhớ cache của trình duyệt bị xóa, chuỗi được mã hóa base64 sẽ không còn tham chiếu hình ảnh. Chuỗi base64 không phải là dữ liệu hình ảnh thực tế, nó là một tham chiếu url cho hình ảnh và bạn không nên lưu nó vào cơ sở dữ liệu với hy vọng lấy lại dữ liệu hình ảnh. Gần đây tôi đã mắc lỗi này (khoảng 3 phút trước).
tfmontague

9
để tránh các vấn đề về bộ nhớ, bạn nên gọi URL.revokeObjectURLkhi bạn hoàn thành công việc của mình
Apolo

@Apolo không có trong trường hợp này, hãy xem câu trả lời này: stackoverflow.com/a/49346614/2313004
grreeenn

Hãy thử giải pháp của bạn .... cảm ơn
Ajay Kumar

219

Giải pháp một lớp lót:

Đoạn mã sau sử dụng URL đối tượng, hiệu quả hơn URL dữ liệu để xem hình ảnh lớn (URL dữ liệu là một chuỗi lớn chứa tất cả dữ liệu tệp, trong khi URL đối tượng, chỉ là một chuỗi ngắn tham chiếu dữ liệu tệp trong- ký ức):

<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 được tạo sẽ như sau:

blob:http%3A//localhost/7514bc74-65d4-4cf0-a0df-3de016824345

2
@Raptor và toàn bộ API tệp ... ( FileReader, input.filesv.v.) URL.createObjectURLlà cách để xử lý các tệp do người dùng gửi, nó chỉ tạo một liên kết tượng trưng trong bộ nhớ đến tệp thực trên đĩa của người dùng.
Kaiido

@cnlevy Làm thế nào chúng ta có thể truy cập các tập tin được tải lên? Có phải chỉ có thể lấy nó từ URL như bạn đã đề cập? Để cụ thể, tôi đang sử dụng bình đã hỗ trợ truy cập các tệp đã tải lên. Có một số cách khác với một lớp lót này?
Abhishek Singh

đây là câu trả lời hay nhất từ ​​trước đến nay
Navid Farjad

Giải pháp này không hiệu quả với tôi. Xem trước hình ảnh không hiển thị.
Sundaramoorthy J

Câu trả lời tốt nhất! Cảm ơn bạn
A7madev

46

Câu trả lời của L assTaTT hoạt động tốt trong các trình duyệt "tiêu chuẩn" như FF và Chrome. Các giải pháp cho IE tồn tại nhưng trông khác nhau. Dưới đây mô tả giải pháp trình duyệt chéo:

Trong HTML, chúng tôi cần hai yếu tố xem trước, imgcho các trình duyệt tiêu chuẩn và divcho IE

HTML:

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

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

Trong CSS, chúng tôi chỉ định điều cụ thể của IE sau đây:

CSS:

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

Trong HTML, chúng tôi bao gồm các Javascripts tiêu chuẩn và dành riêng cho IE:

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

Các pic_preview.jslà Javascript từ câu trả lời của LeassTaTT. Thay $('#blah')whith $('#preview')và thêm$('#preview').show()

Bây giờ là Javascript cụ thể của IE (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';
}    

Đó là. Hoạt động trong IE7, IE8, FF và Chrome. Vui lòng kiểm tra trong IE9 và báo cáo. Ý tưởng về bản xem trước IE đã được tìm thấy ở đây: http://forums.asp.net/t/1320559.aspx

http://msdn.microsoft.com/en-us/l Library / ms532969 (v = vs85) .aspx


24

Tôi đã chỉnh sửa câu trả lời của @ Ivan để hiển thị hình ảnh "Không có bản xem trước", nếu đó không phải là hình ảnh:

function readURL(input) {
    var url = input.value;
    var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
    if (input.files && input.files[0]&& (ext == "gif" || ext == "png" || ext == "jpeg" || ext == "jpg")) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('.imagepreview').attr('src', e.target.result);
        }

        reader.readAsDataURL(input.files[0]);
    }else{
         $('.imagepreview').attr('src', '/assets/no_preview.png');
    }
}

19

Đây là phiên bản nhiều tệp , dựa trên câu trả lời của Ivan Baev.

HTML

<input type="file" multiple id="gallery-photo-add">
<div class="gallery"></div>

JavaScript / jQuery

$(function() {
    // Multiple images preview in browser
    var imagesPreview = function(input, placeToInsertImagePreview) {

        if (input.files) {
            var filesAmount = input.files.length;

            for (i = 0; i < filesAmount; i++) {
                var reader = new FileReader();

                reader.onload = function(event) {
                    $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);
                }

                reader.readAsDataURL(input.files[i]);
            }
        }

    };

    $('#gallery-photo-add').on('change', function() {
        imagesPreview(this, 'div.gallery');
    });
});

Yêu cầu jQuery 1.8 do sử dụng $ .parseHTML, điều này sẽ giúp giảm thiểu XSS.

Điều này sẽ hoạt động tốt và phụ thuộc duy nhất bạn cần là jQuery.


16

Đúng. Điều đó là có thể.

Html

<input type="file" accept="image/*"  onchange="showMyImage(this)" />
 <br/>
<img id="thumbnil" style="width:20%; margin-top:10px;"  src="" alt="image"/>

Mã não

 function showMyImage(fileInput) {
        var files = fileInput.files;
        for (var i = 0; i < files.length; i++) {           
            var file = files[i];
            var imageType = /image.*/;     
            if (!file.type.match(imageType)) {
                continue;
            }           
            var img=document.getElementById("thumbnil");            
            img.file = file;    
            var reader = new FileReader();
            reader.onload = (function(aImg) { 
                return function(e) { 
                    aImg.src = e.target.result; 
                }; 
            })(img);
            reader.readAsDataURL(file);
        }    
    }

Bạn có thể nhận Live Demo từ đây.


11

JSfiddle sạch sẽ và đơn giản

Điều này sẽ hữu ích khi bạn muốn Sự kiện được kích hoạt gián tiếp từ div hoặc nút.

<img id="image-preview"  style="height:100px; width:100px;"  src="" >

<input style="display:none" id="input-image-hidden" onchange="document.getElementById('image-preview').src = window.URL.createObjectURL(this.files[0])" type="file" accept="image/jpeg, image/png">

<button  onclick="HandleBrowseClick('input-image-hidden');" >UPLOAD IMAGE</button>


<script type="text/javascript">
function HandleBrowseClick(hidden_input_image)
{
    var fileinputElement = document.getElementById(hidden_input_image);
    fileinputElement.click();
}     
</script>

Chỉ cần một lưu ý: Tôi không thể tin vào điều này nhưng bạn có thể sử dụng <label>và tránh javascript để xử lý nút bấm hoàn toàn. Kích hoạt đầu vào tệp với HTML / CSS thuần. , và nó không hacky chút nào.
Joe thường xuyên

7

Ví dụ với nhiều hình ảnh sử dụng JavaScript (jQuery) và HTML5

JavaScript (jQuery)

function readURL(input) {
     for(var i =0; i< input.files.length; i++){
         if (input.files[i]) {
            var reader = new FileReader();

            reader.onload = function (e) {
               var img = $('<img id="dynamic">');
               img.attr('src', e.target.result);
               img.appendTo('#form1');  
            }
            reader.readAsDataURL(input.files[i]);
           }
        }
    }

    $("#imgUpload").change(function(){
        readURL(this);
    });
}

Đánh dấu (HTML)

<form id="form1" runat="server">
    <input type="file" id="imgUpload" multiple/>
</form>

5

Làm thế nào về việc tạo một chức năng tải tập tin và kích hoạt một sự kiện tùy chỉnh. Sau đó gắn một người nghe vào đầu vào. Bằng cách này, chúng tôi linh hoạt hơn để sử dụng tệp, không chỉ để xem trước hình ảnh.

/**
 * @param {domElement} input - The input element
 * @param {string} typeData - The type of data to be return in the event object. 
 */
function loadFileFromInput(input,typeData) {
    var reader,
        fileLoadedEvent,
        files = input.files;

    if (files && files[0]) {
        reader = new FileReader();

        reader.onload = function (e) {
            fileLoadedEvent = new CustomEvent('fileLoaded',{
                detail:{
                    data:reader.result,
                    file:files[0]  
                },
                bubbles:true,
                cancelable:true
            });
            input.dispatchEvent(fileLoadedEvent);
        }
        switch(typeData) {
            case 'arraybuffer':
                reader.readAsArrayBuffer(files[0]);
                break;
            case 'dataurl':
                reader.readAsDataURL(files[0]);
                break;
            case 'binarystring':
                reader.readAsBinaryString(files[0]);
                break;
            case 'text':
                reader.readAsText(files[0]);
                break;
        }
    }
}
function fileHandler (e) {
    var data = e.detail.data,
        fileInfo = e.detail.file;

    img.src = data;
}
var input = document.getElementById('inputId'),
    img = document.getElementById('imgId');

input.onchange = function (e) {
    loadFileFromInput(e.target,'dataurl');
};

input.addEventListener('fileLoaded',fileHandler)

Có thể mã của tôi không tốt như một số người dùng nhưng tôi nghĩ bạn sẽ hiểu được ý nghĩa của nó. Ở đây bạn có thể xem một ví dụ


5

Sau đây là mã làm việc.

<input type='file' onchange="readURL(this);" /> 
<img id="ShowImage" src="#" />

Javascript:

 function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();

            reader.onload = function (e) {
                $('#ShowImage')
                    .attr('src', e.target.result)
                    .width(150)
                    .height(200);
            };

            reader.readAsDataURL(input.files[0]);
        }
    }

4

Trong React, nếu tệp nằm trong đạo cụ của bạn, bạn có thể sử dụng:

{props.value instanceof File && (
    <img src={URL.createObjectURL(props.value)}/>
)}

1
Điều này đã cứu cuộc đời tôi! Đơn giản hơn nhiều so với giải pháp React sử dụng FileReader
Jonathan

2

Giải pháp này thì sao?

Chỉ cần thêm thuộc tính dữ liệu "data-type = editable" vào thẻ hình ảnh như thế này:

<img data-type="editable" id="companyLogo" src="http://www.coventrywebgraphicdesign.co.uk/wp-content/uploads/logo-here.jpg" height="300px" width="300px" />

Và kịch bản cho dự án của bạn ngoài khóa học ...

function init() {
    $("img[data-type=editable]").each(function (i, e) {
        var _inputFile = $('<input/>')
            .attr('type', 'file')
            .attr('hidden', 'hidden')
            .attr('onchange', 'readImage()')
            .attr('data-image-placeholder', e.id);

        $(e.parentElement).append(_inputFile);

        $(e).on("click", _inputFile, triggerClick);
    });
}

function triggerClick(e) {
    e.data.click();
}

Element.prototype.readImage = function () {
    var _inputFile = this;
    if (_inputFile && _inputFile.files && _inputFile.files[0]) {
        var _fileReader = new FileReader();
        _fileReader.onload = function (e) {
            var _imagePlaceholder = _inputFile.attributes.getNamedItem("data-image-placeholder").value;
            var _img = $("#" + _imagePlaceholder);
            _img.attr("src", e.target.result);
        };
        _fileReader.readAsDataURL(_inputFile.files[0]);
    }
};

// 
// IIFE - Immediately Invoked Function Expression
// /programming/18307078/jquery-best-practises-in-case-of-document-ready
(

function (yourcode) {
    "use strict";
    // The global jQuery object is passed as a parameter
    yourcode(window.jQuery, window, document);
}(

function ($, window, document) {
    "use strict";
    // The $ is now locally scoped 
    $(function () {
        // The DOM is ready!
        init();
    });

    // The rest of your code goes here!
}));

Xem bản demo tại JSFiddle


2

Thử cái này

window.onload = function() {
  if (window.File && window.FileList && window.FileReader) {
    var filesInput = document.getElementById("uploadImage");
    filesInput.addEventListener("change", function(event) {
      var files = event.target.files;
      var output = document.getElementById("result");
      for (var i = 0; i < files.length; i++) {
        var file = files[i];
        if (!file.type.match('image'))
          continue;
        var picReader = new FileReader();
        picReader.addEventListener("load", function(event) {
          var picFile = event.target;
          var div = document.createElement("div");
          div.innerHTML = "<img class='thumbnail' src='" + picFile.result + "'" +
            "title='" + picFile.name + "'/>";
          output.insertBefore(div, null);
        });        
        picReader.readAsDataURL(file);
      }

    });
  }
}
<input type="file" id="uploadImage" name="termek_file" class="file_input" multiple/>
<div id="result" class="uploadPreview">


2

Xem trước nhiều hình ảnh trước khi nó được tải lên bằng jQuery / javascript?

Điều này sẽ xem trước nhiều tệp dưới dạng hình thu nhỏ cùng một lúc

Html

<input id="ImageMedias" multiple="multiple" name="ImageMedias" type="file"
accept=".jfif,.jpg,.jpeg,.png,.gif" class="custom-file-input"  value="">                                    
<div id="divImageMediaPreview"></div>

Kịch bản

$("#ImageMedias").change(function () {
    if (typeof (FileReader) != "undefined") {
        var dvPreview = $("#divImageMediaPreview");
        dvPreview.html("");            
        $($(this)[0].files).each(function () {
            var file = $(this);                
                var reader = new FileReader();
                reader.onload = function (e) {
                    var img = $("<img />");
                    img.attr("style", "width: 150px; height:100px; padding: 10px");
                    img.attr("src", e.target.result);
                    dvPreview.append(img);
                }
                reader.readAsDataURL(file[0]);                
        });
    } else {
        alert("This browser does not support HTML5 FileReader.");
    }
});

Demo làm việc trên Codepen

Demo làm việc trên jsfiddle

Hy vọng điều này có thể giúp cho bạn.


1

Tôi đã tạo một plugin có thể tạo hiệu ứng xem trước trong IE 7+ nhờ internet, nhưng có một vài hạn chế. Tôi đặt nó vào một trang github để dễ lấy nó hơn

$(function () {
		$("input[name=file1]").previewimage({
			div: ".preview",
			imgwidth: 180,
			imgheight: 120
		});
		$("input[name=file2]").previewimage({
			div: ".preview2",
			imgwidth: 90,
			imgheight: 90
		});
	});
.preview > div {
  display: inline-block;
  text-align:center;
}

.preview2 > div {
  display: inline-block; 
  text-align:center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://rawgit.com/andrewng330/PreviewImage/master/preview.image.min.js"></script>
	Preview
	<div class="preview"></div>
	Preview2
	<div class="preview2"></div>

	<form action="#" method="POST" enctype="multipart/form-data">
		<input type="file" name="file1">
		<input type="file" name="file2">
		<input type="submit">
	</form>


1

Để tải lên nhiều hình ảnh (Sửa đổi Giải pháp của @ IvanBaev)

function readURL(input) {
    if (input.files && input.files[0]) {
        var i;
        for (i = 0; i < input.files.length; ++i) {
          var reader = new FileReader();
          reader.onload = function (e) {
              $('#form1').append('<img src="'+e.target.result+'">');
          }
          reader.readAsDataURL(input.files[i]);
        }
    }
}

http://jsfiddle.net/LvsYc/12330/

Hy vọng điều này sẽ giúp được ai đó.


1

Đó là mã của tôi. Hỗ trợ IE [6-9] 、 chrome 17 + 、 firefox Opera 11 + Maxthon3

   
function previewImage(fileObj, imgPreviewId) {
    var allowExtention = ".jpg,.bmp,.gif,.png";  //allowed to upload file type
    document.getElementById("hfAllowPicSuffix").value;
    var extention = fileObj.value.substring(fileObj.value.lastIndexOf(".") + 1).toLowerCase();
    var browserVersion = window.navigator.userAgent.toUpperCase();
    if (allowExtention.indexOf(extention) > -1) {
        if (fileObj.files) {
            if (window.FileReader) {
                var reader = new FileReader();
                reader.onload = function (e) {
                    document.getElementById(imgPreviewId).setAttribute("src", e.target.result);
                };
                reader.readAsDataURL(fileObj.files[0]);
            } else if (browserVersion.indexOf("SAFARI") > -1) {
                alert("don't support  Safari6.0 below broswer");
            }
        } else if (browserVersion.indexOf("MSIE") > -1) {
            if (browserVersion.indexOf("MSIE 6") > -1) {//ie6
                document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
            } else {//ie[7-9]
                fileObj.select();
                fileObj.blur(); 
                var newPreview = document.getElementById(imgPreviewId);

                newPreview.style.border = "solid 1px #eeeeee";
                newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";
                newPreview.style.display = "block";

            }
        } else if (browserVersion.indexOf("FIREFOX") > -1) {//firefox
            var firefoxVersion = parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
            if (firefoxVersion < 7) {//firefox7 below
                document.getElementById(imgPreviewId).setAttribute("src", fileObj.files[0].getAsDataURL());
            } else {//firefox7.0+ 
                document.getElementById(imgPreviewId).setAttribute("src", window.URL.createObjectURL(fileObj.files[0]));
            }
        } else {
            document.getElementById(imgPreviewId).setAttribute("src", fileObj.value);
        }
    } else {
        alert("only support" + allowExtention + "suffix");
        fileObj.value = ""; //clear Selected file
        if (browserVersion.indexOf("MSIE") > -1) {
            fileObj.select();
            document.selection.clear();
        }

    }
}
function changeFile(elem) {
    //file object , preview img tag id
    previewImage(elem,'imagePreview')
}
<input type="file"  id="netBarBig"  onchange="changeFile(this)"  />
<img  src="" id="imagePreview" style="width:120px;height:80px;" alt=""/>


1

Iamge mặc định

                @Html.TextBoxFor(x => x.productModels.DefaultImage, new {@type = "file", @class = "form-control", onchange = "openFile(event)", @name = "DefaultImage", @id = "DefaultImage" })
                @Html.ValidationMessageFor(model => model.productModels.DefaultImage, "", new { @class = "text-danger" })
                    <img src="~/img/ApHandler.png"  style="height:125px; width:125px" id="DefaultImagePreview"/>
            </div>

 <script>
    var openFile = function (event) {
        var input = event.target;

        var reader = new FileReader();
        reader.onload = function () {
            var dataURL = reader.result;
            var output = document.getElementById('DefaultImagePreview');
            output.src = dataURL;
        };
        reader.readAsDataURL(input.files[0]);
    };
</script>

0

Đây là một giải pháp nếu bạn đang sử dụng React:

import * as React from 'react'
import { useDropzone } from 'react-dropzone'

function imageDropper() {
  const [imageUrl, setImageUrl] = React.useState()
  const [imageFile, setImageFile] = React.useState()

  const onDrop = React.useCallback(
    acceptedFiles => {
      const file = acceptedFiles[0]
      setImageFile(file)

      // convert file to data: url
      const reader = new FileReader()
      reader.addEventListener('load', () => setImageUrl(String(reader.result)), false)
      reader.readAsDataURL(file)
    },
    [setImageFile, setImageUrl]
  )
  const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop })

  return (
    <div>
      <div {...getRootProps()}>
        {imageFile ? imageFile.name : ''}
        {isDragActive ? <p>Drop files here...</p> : <p>Select image file...</p>}
        <input {...getInputProps()} />
      </div>
      {imageUrl && (
        <div>
          Your image: <img src={imageUrl} />
        </div>
      )}
    </div>
  )
}

0

Đây là phương pháp đơn giản nhất để xem trước hình ảnh trước khi tải nó lên máy chủ từ trình duyệt mà không cần sử dụng Ajax hoặc bất kỳ chức năng phức tạp nào. Nó cần một sự kiện "onchange" để tải hình ảnh.

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

Hình ảnh sẽ được tải ngay lập tức sau khi chọn nó.


-2

đối với ứng dụng của tôi, với các tham số url được mã hóa, chỉ điều này hoạt động. Tôi luôn luôn có một TypeError: $(...) is null. Lấy từ https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

function previewFile() {
  var preview = document.querySelector('img');
  var file    = document.querySelector('input[type=file]').files[0];
  var reader  = new FileReader();

  reader.addEventListener("load", function () {
    preview.src = reader.result;
  }, false);

  if (file) {
    reader.readAsDataURL(file);
  }
}
<input type="file" onchange="previewFile()"><br>
<img src="" height="200" alt="Image preview...">


-2
function assignFilePreviews() {
    $('input[data-previewable=\"true\"]').change(function() {
        var prvCnt = $(this).attr('data-preview-container');
        if (prvCnt) {
            if (this.files && this.files[0]) {
                var reader = new FileReader();
                reader.onload = function(e) {
                    var img = $('<img>');
                    img.attr('src', e.target.result);
                    img.error(function() {
                        $(prvCnt).html('');
                    });
                    $(prvCnt).html('');
                    img.appendTo(prvCnt);
                }
                reader.readAsDataURL(this.files[0]);
            }
        }
    });
}
$(document).ready(function() {
    assignFilePreviews();
});

HTML

<input type="file" data-previewable="true" data-preview-container=".prd-img-prv" />
<div class = "prd-img-prv"></div>

Điều này cũng xử lý trường hợp khi tệp có loại không hợp lệ (ví dụ pdf) được chọn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.