HTML: Làm thế nào để giới hạn tải lên tệp chỉ là hình ảnh?


126

Với HTML, làm cách nào để giới hạn loại tệp có thể được tải lên?

Để dễ dàng trải nghiệm người dùng, tôi muốn giới hạn tải lên tệp chỉ là hình ảnh (jpeg, gif, png).

<form method="post" action="..." enctype="multipart/form-data">
<label for="image">Photo</label>
<input name="image" type="file" />
</form>

Rõ ràng, để đảm bảo an toàn cho điều này - tôi sẽ kiểm tra phía phụ trợ / máy chủ. Nhưng tất cả những gì tôi đang tìm kiếm là một cách đơn giản là trải nghiệm người dùng để khi họ nhấp vào "duyệt" để tìm hình ảnh họ muốn tải lên, họ không phải xem tất cả các tài liệu từ đó, v.v. tải lên
JacobT

Tôi không biết rằng bạn có thể đặt mặt nạ tệp. Tôi chưa bao giờ thấy nó được thực hiện thành công.
Robert K

Câu trả lời:


230

HTML5 nói <input type="file" accept="image/*">. Tất nhiên, không bao giờ tin tưởng xác thực phía máy khách: Luôn kiểm tra lại ở phía máy chủ ...


87

Đầu vào tệp HTML5 có thuộc tính chấp nhận và nhiều thuộc tính. Bằng cách sử dụng nhiều thuộc tính, bạn có thể tải lên nhiều hình ảnh trong một ví dụ.

<input type="file" multiple accept='image/*'>

Bạn cũng có thể giới hạn nhiều loại mime.

<input type="file" multiple accept='image/*|audio/*|video/*' >

và một cách khác để kiểm tra loại mime bằng cách sử dụng đối tượng tệp.

đối tượng tập tin cung cấp cho bạn tên, kích thước và loại.

var files=e.target.files;

var mimeType=files[0].type; // You can get the mime type

Bạn cũng có thể hạn chế người dùng đối với một số loại tệp để tải lên theo mã trên.


4
image/*|audio/*|video/*không hoạt động đối với tôi, nó có vẻ như được phân tách bằng dấu phẩy:image/*,video/mp4,.txt
serg

Tuyệt vời để kiểm tra mimeType! Tx!
Pedro Ferreira

6

Đã chỉnh sửa

Nếu mọi thứ đúng như họ NÊN, bạn có thể thực hiện việc này thông qua thuộc tính "Chấp nhận".

http://www.webmasterworld.com/forum21/6310.htm

Tuy nhiên, các trình duyệt khá nhiều bỏ qua điều này, vì vậy điều này là không liên quan. Câu trả lời ngắn gọn là, tôi không nghĩ có một cách để làm điều đó trong HTML. Thay vào đó, bạn phải kiểm tra phía máy chủ.

Bài viết cũ hơn sau đây có một số thông tin có thể giúp bạn với các lựa chọn thay thế.

Nhập thuộc tính 'chấp nhận' - nó có hữu ích không?


6

Đây là HTML để tải lên hình ảnh. Theo mặc định, nó sẽ chỉ hiển thị các tệp hình ảnh trong cửa sổ duyệt vì chúng tôi đã đặt accept="image/*". Nhưng chúng ta vẫn có thể thay đổi nó từ danh sách thả xuống và nó sẽ hiển thị tất cả các tệp. Vì vậy, phần Javascript xác thực xem tệp đã chọn có phải là hình ảnh thực tế hay không.

 <div class="col-sm-8 img-upload-section">
     <input name="image3" type="file" accept="image/*" id="menu_images"/>
     <img id="menu_image" class="preview_img" />
     <input type="submit" value="Submit" />
 </div> 

Ở đây về sự kiện thay đổi, trước tiên chúng tôi kiểm tra kích thước của hình ảnh. Và trong ifđiều kiện thứ hai, chúng tôi kiểm tra xem đó có phải là tệp hình ảnh hay không.

this.files[0].type.indexOf("image")sẽ là -1nếu nó không phải là một tập tin hình ảnh.

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Xin vui lòng thêm lời giải thích.
Paul Swetz

Xin lưu ý rằng ở trên đòi hỏi jquery, nhưng không nói như vậy. Đủ dễ để tìm ra, nhưng hữu ích để nêu. Tôi đã tạo ra một fiddle cho điều này . Nó thực hiện một số thứ khác (theo yêu cầu cho một dự án), nhưng khái niệm này rất giống nhau.
Dave Land

1

Bạn chỉ có thể làm điều này một cách an toàn ở phía máy chủ. Sử dụng thuộc tính "chấp nhận" là tốt, nhưng cũng phải được xác thực ở phía máy chủ vì sợ người dùng có thể xác nhận tập lệnh của bạn mà không bị giới hạn.

Tôi đề nghị bạn: loại bỏ bất kỳ tệp không phải hình ảnh nào, cảnh báo người dùng và hiển thị lại biểu mẫu.


1
<script>

    function chng()
    {
        var typ=document.getElementById("fiile").value;
        var res = typ.match(".jp");

        if(res)
        {
            alert("sucess");
        }
        else
        {
            alert("Sorry only jpeg images are accepted");
            document.getElementById("fiile").value="; //clear the uploaded file
        }
    }

</script>

Bây giờ trong phần html

<input type="file" onchange="chng()">

mã này sẽ kiểm tra xem tệp đã tải lên có phải là tệp jpg hay không và hạn chế tải lên các loại khác


Kiểm tra này bị đánh bại bằng cách đổi tên đơn giản của phần mở rộng tập tin. Ít nhất bạn nên kiểm tra loại URI dữ liệu nếu bạn sẽ làm một cái gì đó như thế này.
Lucas Leblanc

0

Cuối cùng, bộ lọc được hiển thị trong cửa sổ Duyệt được trình duyệt đặt. Bạn có thể chỉ định tất cả các bộ lọc bạn muốn trong thuộc tính Chấp nhận, nhưng bạn không có gì đảm bảo rằng trình duyệt của người dùng của bạn sẽ tuân thủ nó.

Đặt cược tốt nhất của bạn là thực hiện một số loại lọc ở mặt sau trên máy chủ.


0

Kiểm tra một dự án gọi là Uploadify. http://www.uploadify.com/

Đó là trình tải lên tệp dựa trên Flash + jQuery. Thao tác này sử dụng hộp thoại chọn tệp của Flash, cung cấp cho bạn khả năng lọc các loại tệp, chọn nhiều tệp cùng một lúc, v.v.


30
Flash? ... Không đời nào!
ErickBest

14
Giải pháp tồi tệ nhất.
Matteo Mosconi

1
Các bạn, tôi không hiểu tại sao đó là giải pháp tồi tệ nhất. Mặc dù Flash thực sự sẽ biến mất, nhưng nó vẫn được sử dụng bởi các trình duyệt cũ - rất cũ, ok, nhưng vẫn đang được sử dụng - và giải pháp này có cả hai loại công nghệ: dự phòng jQuery + HTML5 & Flash. Nó cũng tốt như VideoJS, có Flash dự phòng trong trường hợp trình duyệt không thể phát video ... Tôi chưa thử nghiệm giải pháp, nó có thể không phải là tốt nhất, nhưng các downvote không công bằng.
Ungedra

1
+1 Ngớ ngẩn để bỏ phiếu xuống. Flash sẽ biến mất nhưng có dự phòng tốt. Bạn nghĩ gì Google sử dụng cho gmail cho dự phòng ổ cắm? Ngớ ngẩn.
Jason Sebring

8
Câu trả lời này là 4 tuổi. Vào thời điểm đó, hỗ trợ HTML5 cho nhiều lựa chọn tệp hoặc lọc cửa sổ tệp chọn theo các loại được chấp nhận không được hỗ trợ tốt trong bất kỳ trình duyệt chính nào. Đây là một giải pháp có thể có hiệu quả với nhiều người vào thời điểm đó, nhưng giờ tôi đang hướng tới một giải pháp HTML5 thuần túy.
AndrewR
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.