ค้นหาเว็บไซต์

javascript - แสดงตัวอย่างรูปภาพก่อนที่มันจะถูกอัปโหลด


ฉันต้องการสามารถดูตัวอย่างไฟล์ (รูปภาพ) ก่อนที่จะอัปโหลดได้ การดูตัวอย่างควรทำทั้งหมดในเบราว์เซอร์โดยไม่ต้องใช้ Ajax ในการอัปโหลดรูปภาพ

ฉันสามารถทำสิ่งนี้ได้อย่างไร?

คำตอบ #1

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>

คำตอบ #2

มีหลายวิธีที่คุณสามารถทำสิ่งนี้ได้ วิธีที่มีประสิทธิภาพที่สุดคือการใช้ 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>

คำตอบ #3

วิธีแก้แบบหนึ่งบรรทัด:

โค้ดต่อไปนี้ใช้ 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

คำตอบ #4

ลองอันนี้


เพื่อดูภาพตัวอย่างก่อนอัปโหลดไปยังเซิร์ฟเวอร์จากเบราว์เซอร์โดยไม่ใช้ 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>

คลิกที่นี่เพื่อดูตัวอย่างหลายรูปภาพ

คำตอบ #5

คำตอบของ 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:

<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 คือ Javascript จากคำตอบของ LeassTaTT แทนที่ $ ('#blah') ด้วย $ ('#preview') และเพิ่ม $ ('#preview').show()

ตอนนี้ Javascript เฉพาะ 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';
}    

นั่นแหละ ทำงานได้ใน IE7, IE8, FF และ Chrome กรุณาทดสอบใน IE9 และรายงาน ความคิดเรื่อง IE preview ถูกพบที่นี่: http://forums.asp.net/t/1320559.aspx

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

คำตอบ #6

สองบรรทัดสั้น

นี่คือการปรับปรุงขนาดของคำตอบ cmlevy - ลองดู

<input type=file oninput="pic.src=window.URL.createObjectURL(this.files[0])">
<img id="pic" />

คำตอบ #7

ฉันได้แก้ไขคำตอบของ @Ivan เพื่อแสดงรูปภาพ "ไม่มีตัวอย่างให้ดู" หากมันไม่ใช่รูปภาพ:

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');
    }
}

คำตอบ #8

นี่คือเวอร์ชัน หลายไฟล์ โดยอิงจากคำตอบของ Ivan Baev

เอชทีเอ็มแอล

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

จาวาสคริปต์/เจเควรี่

$(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');
    });
});

ต้องการ jQuery 1.8 เนื่องจากการใช้งาน $.parseHTML ซึ่งควรช่วยในการลดความเสี่ยงของ XSS

นี่จะใช้งานได้ทันที และสิ่งที่ต้องพึ่งพาเดียวที่คุณต้องการคือ jQuery

คำตอบ #9

ใช่ มันเป็นไปได้

เอชทีเอ็มแอล

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

JS

 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);
        }    
    }

คุณสามารถรับการสาธิตสดได้จากที่นี่

คำตอบ #10

เพื่อพรีวิวหลายไฟล์ โดยใช้ jquery

$(document).ready(function(){
    $('#image').change(function(){
        $("#frames").html('');
        for (var i = 0; i < $(this)[0].files.length; i++) {
            $("#frames").append('<img src="'+window.URL.createObjectURL(this.files[i])+'" width="100px" height="100px"/>');
        }
    });
});
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <input type="file" id="image" name="image[]" multiple /><br/>
    <div id="frames"></div>
</body>

คำตอบ #11

สะอาดและเรียบง่าย JSfiddle

นี่จะมีประโยชน์เมื่อคุณต้องการให้เหตุการณ์ถูกเรียกใช้อย่างอ้อมจาก div หรือปุ่ม

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

บทความที่เกี่ยวข้อง