Buộc trình duyệt tải xuống tệp hình ảnh khi nhấp chuột


100

Tôi cần trình duyệt tải xuống các tệp hình ảnh giống như khi nhấp vào trang tính Excel.

Có cách nào để thực hiện việc này chỉ bằng lập trình phía máy khách không?

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript" src="Scripts/jquery-1.10.2.js">
        $(document).ready(function () {
            $("*").click(function () {
                $("p").hide();
            });
        });
        </script>
    </head>

    <script type="text/javascript">
        document.onclick = function (e) {
            e = e || window.event;
            var element = e.target || e.srcElement;
            if (element.innerHTML == "Image") {
                //someFunction(element.href);
                var name = element.nameProp;
                var address = element.href;
                saveImageAs1(element.nameProp, element.href);
                return false; // Prevent default action and stop event propagation
            }
            else
                return true;
        };

        function saveImageAs1(name, adress) {
            if (confirm('you wanna save this image?')) {
                window.win = open(adress);
                //response.redirect("~/testpage.html");
                setTimeout('win.document.execCommand("SaveAs")', 100);
                setTimeout('win.close()', 500);
            }
        }
    </script>

    <body>
        <form id="form1" runat="server">
            <div>
                <p>
                    <a href="http://localhost:55298/SaveImage/demo/Sample2.xlsx" target="_blank">Excel</a><br />
                    <a href="http://localhost:55298/SaveImage/demo/abc.jpg" id="abc">Image</a>
                </p>
            </div>
        </form>
    </body>
</html>

Nó sẽ hoạt động như thế nào trong trường hợp tải xuống một trang tính Excel (trình duyệt nào làm được)?


7
Các downloadthuộc tính.
Šime Vidas

6
Cách tốt nhất để đảm bảo tải xuống tệp là thiết lập bố cục nội dung trên máy chủ, hầu hết các giải pháp phía máy khách không đáng tin cậy như vậy.
adeneo


Có một câu hỏi tương tự mà đã trả lời cho bạn: stackoverflow.com/a/6799284/1948211
dschu

Karl-Andre Gagnon: Hãy đi qua nó properply [i đã không được gắn thẻ HTML 5 như tôi không muốn sử dụng nó] và w / o máy chủ chạm vào.
Amit

Câu trả lời:


172

Sử dụng HTML5, bạn có thể thêm thuộc tính 'tải xuống' vào các liên kết của mình.

<a href="https://stackoverflow.com/path/to/image.png" download>

Sau đó, các trình duyệt tuân thủ sẽ nhắc tải xuống hình ảnh có cùng tên tệp (trong ví dụ này là image.png).

Nếu bạn chỉ định giá trị cho thuộc tính này, thì thuộc tính đó sẽ trở thành tên tệp mới:

<a href="https://stackoverflow.com/path/to/image.png" download="AwesomeImage.png">

CẬP NHẬT: Tính đến mùa xuân 2018 này không còn có thể cho cross-nguồn gốc hrefs . Vì vậy, nếu bạn muốn tạo <a href="https://i.imgur.com/IskAzqA.jpg" download>trên một tên miền không phải imgur.com thì nó sẽ không hoạt động như dự định. Thông báo về việc ngừng sử dụng và xóa Chrome


Richard Parnaby-King: Sử dụng HTML 5 thuộc tính nó có thể được thực hiện, nhưng tôi cần phải làm điều đó KHÔNG sử dụng HTML5 hoặc bất kỳ công cụ phía máy chủ (nếu là nó có thể làm) Cảm ơn những người giúp đỡ :)
Amit

2
Chưa được hỗ trợ đầy đủ trong tất cả các trình duyệt nhưng đó là một giải pháp tốt nếu bạn không quan tâm đến IE hoặc Safari. caniuse.com/#feat=download
stacigh

Cảm ơn, vì một giải pháp HTML5. Làm cách nào để vẫn cho phép 'lưu dưới dạng' để tôi nhập tên tệp trước khi lưu?
teleman

Tôi không thể kiểm soát nơi tệp này sẽ được tải xuống? Nó chỉ tải xuống để tải thư mục trực tiếp. Tôi muốn nó sử dụng đường dẫn cục bộ của tệp html.
Arjun Chiddarwar 13/12/16

1
@ArjunChiddarwar Không, điều đó mở ra các lỗ hổng bảo mật (hãy tưởng tượng ai đó lưu một tệp độc hại trực tiếp vào thư mục Windows của bạn). Đường dẫn tải xuống dựa trên cài đặt trình duyệt - ví dụ: theo mặc định, Chrome sẽ tải xuống thư mục tải xuống của bạn.
Richard Parnaby-King

96

Tôi đã quản lý để làm cho điều này hoạt động trong Chrome và Firefox bằng cách thêm một liên kết đến tài liệu.

var link = document.createElement('a');
link.href = 'images.jpg';
link.download = 'Download.jpg';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

2
Đây thực sự là một giải pháp rất hay cho các ứng dụng web mà Javascript ở khắp nơi. Tuy nhiên, chỉ hoạt động trong Google Chrome (trong thiết lập thử nghiệm của tôi).
Pavel

Bất kỳ ý tưởng về một cách để kiểm tra tính tương thích? Tôi muốn sử dụng kỹ thuật này nhưng cũng cần hỗ trợ các trình duyệt khác, vì vậy tôi cần cung cấp một giải pháp thay thế (như mở PDF trong cửa sổ mới hoặc liên kết để tải xuống) khi điều này không được hỗ trợ. Có ai đã có bất kỳ may mắn với điều đó?
alexrussell

13
Giải pháp tuyệt vời, cảm ơn! Lưu ý rằng nếu bạn bỏ qua document.body.appendChild(link)nó sẽ không hoạt động trong firefox. Nó cũng tốt để loại bỏ yếu tố tạo ra với document.body.removeChild(link);saulink.click()
AKN

8
giải pháp tốt nhất. Để tránh rác trong DOM sử dụngsetTimeout( function () { link.parentNode.removeChild( link ); },10 );
Mephiztopheles

1
Cảm ơn lẽ ra là câu trả lời được chọn vì câu hỏi hỏi cách thực hiện trong JAVASCRIPT.
codehelp

33

Leeroy & Richard Parnaby-King:

CẬP NHẬT: Kể từ mùa xuân năm 2018, điều này không còn khả thi đối với các hrefs có nguồn gốc chéo. Vì vậy, nếu bạn muốn tạo trên một tên miền không phải imgur.com thì nó sẽ không hoạt động như dự định. Thông báo về việc ngừng sử dụng và xóa Chrome

function forceDownload(url, fileName){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "blob";
    xhr.onload = function(){
        var urlCreator = window.URL || window.webkitURL;
        var imageUrl = urlCreator.createObjectURL(this.response);
        var tag = document.createElement('a');
        tag.href = imageUrl;
        tag.download = fileName;
        document.body.appendChild(tag);
        tag.click();
        document.body.removeChild(tag);
    }
    xhr.send();
}

2
tải hình ảnh nhưng không mở ra khi nó được tuyên bố 'Hình ảnh được chia'
picacode

18

Cập nhật mùa xuân 2018

<a href="/path/to/image.jpg" download="FileName.jpg">

Mặc dù tính năng này vẫn được hỗ trợ, kể từ tháng 2 năm 2018, chrome đã tắt tính năng này để tải xuống từ nhiều nguồn gốc, nghĩa là tính năng này sẽ chỉ hoạt động nếu tệp nằm trên cùng một tên miền.

Tôi đã tìm ra cách giải quyết để tải xuống hình ảnh tên miền chéo sau bản cập nhật mới của Chrome đã vô hiệu hóa tải xuống tên miền chéo. Bạn có thể sửa đổi điều này thành một chức năng phù hợp với nhu cầu của bạn. Bạn có thể có được loại kịch bản hình ảnh (jpeg, png, gif, v.v.) với một số nghiên cứu thêm nếu bạn cần. Có thể có một cách để làm điều gì đó tương tự như vậy với video. Hy vọng điều này sẽ giúp ai đó!

Leeroy & Richard Parnaby-King:

CẬP NHẬT: Kể từ mùa xuân năm 2018, điều này không còn khả thi đối với các hrefs có nguồn gốc chéo. Vì vậy, nếu bạn muốn tạo trên một tên miền không phải imgur.com thì nó sẽ không hoạt động như dự định. Thông báo về việc ngừng sử dụng và xóa Chrome

var image = new Image();
image.crossOrigin = "anonymous";
image.src = "https://is3-ssl.mzstatic.com/image/thumb/Music62/v4/4b/f6/a2/4bf6a267-5a59-be4f-6947-d803849c6a7d/source/200x200bb.jpg";
// get file name - you might need to modify this if your image url doesn't contain a file extension otherwise you can set the file name manually
var fileName = image.src.split(/(\\|\/)/g).pop();
image.onload = function () {
    var canvas = document.createElement('canvas');
    canvas.width = this.naturalWidth; // or 'width' if you want a special/scaled size
    canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size
    canvas.getContext('2d').drawImage(this, 0, 0);
    var blob;
    // ... get as Data URI
    if (image.src.indexOf(".jpg") > -1) {
    blob = canvas.toDataURL("image/jpeg");
    } else if (image.src.indexOf(".png") > -1) {
    blob = canvas.toDataURL("image/png");
    } else if (image.src.indexOf(".gif") > -1) {
    blob = canvas.toDataURL("image/gif");
    } else {
    blob = canvas.toDataURL("image/png");
    }
    $("body").html("<b>Click image to download.</b><br><a download='" + fileName + "' href='" + blob + "'><img src='" + blob + "'/></a>");
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


Có vẻ như đoạn mã này giải mã hình ảnh thành một bộ đệm các pixel trong bộ nhớ trình duyệt, sau đó mã hóa nó thành jpeg / png / gif rồi đóng gói nó vào một data-uri, sau đó hy vọng sẽ được lưu trữ cục bộ. Nếu vậy, điều đó có nghĩa là tất cả siêu dữ liệu từ tệp hình ảnh bị mất. Ngoài ra, việc mã hóa lại JPEG sẽ mất một số chất lượng và có tỷ lệ chất lượng / số lượng byte kém hơn. Tuy nhiên, tốt để biết. Cám ơn vì đã chia sẻ.
Stéphane Gourichon

14

Một cách tiếp cận hiện đại hơn sử dụng Promise và async / await:

toDataURL(url) {
    return fetch(url).then((response) => {
            return response.blob();
        }).then(blob => {
            return URL.createObjectURL(blob);
        });
}

sau đó

async download() {
        const a = document.createElement("a");
        a.href = await toDataURL("https://cdn1.iconfinder.com/data/icons/ninja-things-1/1772/ninja-simple-512.png");
        a.download = "myImage.png";
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
}

Tìm tài liệu tại đây: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch


13
var pom = document.createElement('a');
pom.setAttribute('href', 'data:application/octet-stream,' + encodeURIComponent(text));
pom.setAttribute('download', filename);
pom.style.display = 'none';
document.body.appendChild(pom);
pom.click();
document.body.removeChild(pom);     

5
Trình duyệt Safari không hỗ trợ thuộc tính tải
Pranav Labhe

11

Đây là một giải pháp chung cho vấn đề của bạn. Nhưng có một phần rất quan trọng là phần mở rộng tệp phải khớp với mã hóa của bạn. Và tất nhiên, thông số nội dung đó của hàm downlowadImage phải là chuỗi mã hóa base64 của hình ảnh của bạn.

const clearUrl = url => url.replace(/^data:image\/\w+;base64,/, '');

const downloadImage = (name, content, type) => {
  var link = document.createElement('a');
  link.style = 'position: fixed; left -10000px;';
  link.href = `data:application/octet-stream;base64,${encodeURIComponent(content)}`;
  link.download = /\.\w+/.test(name) ? name : `${name}.${type}`;

  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

['png', 'jpg', 'gif'].forEach(type => {
  var download = document.querySelector(`#${type}`);
  download.addEventListener('click', function() {
    var img = document.querySelector('#img');

    downloadImage('myImage', clearUrl(img.src), type);
  });
});
a gif image: <image id="img" src="data:image/gif;base64,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" />


<button id="png">Download PNG</button>
<button id="jpg">Download JPG</button>
<button id="gif">Download GIF</button>


3
Vui lòng thêm một lời giải thích ngắn gọn vào câu trả lời của bạn để làm cho nó phù hợp với người đã hỏi câu trả lời đó
AGE

1
link.href = 'data: application / octet-stream,' + encodeURIComponent (địa chỉ) làm hư này các tập tin và do đó không thể mở được, Canu đề nghị tại sao nó như vậy
OM Các Eternity

Yeah, câu trả lời này xứng đáng là câu trả lời hay nhất! Phần còn thiếu đối với tôi là thứ "cleanUrl", đã tạo ra dữ liệu không đúng định dạng và phá vỡ tệp.
Iulian Pinzaru

2

Thử cái này:

<a class="button" href="http://www.glamquotes.com/wp-content/uploads/2011/11/smile.jpg" download="smile.jpg">Download image</a>

2

Vào năm 2020, tôi sử dụng Blob để tạo bản sao cục bộ của hình ảnh, trình duyệt sẽ tải xuống dưới dạng tệp. Bạn có thể kiểm tra nó trên trang web này .

nhập mô tả hình ảnh ở đây

(function(global) {
  const next = () => document.querySelector('.search-pagination__button-text').click();
  const uuid = () => Math.random().toString(36).substring(7);
  const toBlob = (src) => new Promise((res) => {
    const img = document.createElement('img');
    const c = document.createElement("canvas");
    const ctx = c.getContext("2d");
    img.onload = ({target}) => {
      c.width = target.naturalWidth;
      c.height = target.naturalHeight;
      ctx.drawImage(target, 0, 0);
      c.toBlob((b) => res(b), "image/jpeg", 0.75);
    };
    img.crossOrigin = "";
    img.src = src;
  });
  const save = (blob, name = 'image.png') => {
    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.target = '_blank';
    a.download = name;
    a.click();
  };
  global.download = () => document.querySelectorAll('.search-content__gallery-results figure > img[src]').forEach(async ({src}) => save(await toBlob(src), `${uuid()}.png`));
  global.next = () => next();
})(window);

Có vẻ như mã này giải mã hình ảnh thành một bộ đệm các pixel (canvas) trong bộ nhớ trình duyệt, sau đó mã hóa nó thành jpeg / png / gif rồi đóng gói nó vào một data-uri, sau đó hy vọng sẽ được lưu trữ cục bộ. Nếu vậy, điều đó có nghĩa là tất cả siêu dữ liệu từ tệp hình ảnh bị mất. Ngoài ra, việc mã hóa lại JPEG sẽ mất một số chất lượng và có tỷ lệ chất lượng / số lượng byte kém hơn. Tuy nhiên, tốt để biết. Cám ơn vì đã chia sẻ.
Stéphane Gourichon

0
<html>
<head>
<script type="text/javascript">
function prepHref(linkElement) {
    var myDiv = document.getElementById('Div_contain_image');
    var myImage = myDiv.children[0];
    linkElement.href = myImage.src;
}
</script>
</head>
<body>
<div id="Div_contain_image"><img src="YourImage.jpg" alt='MyImage'></div>
<a href="#" onclick="prepHref(this)" download>Click here to download image</a>
</body>
</html>

0

Bạn có thể trực tiếp tải xuống tệp này bằng cách sử dụng thẻ liên kết mà không cần nhiều mã.
Sao chép đoạn mã và dán vào trình soạn thảo văn bản của bạn và thử nó ...!

<html>
<head>
</head>
<body>
   <div>
     <img src="https://upload.wikimedia.org/wikipedia/commons/1/1f/SMirC-thumbsup.svg" width="200" height="200">
      <a href="#" download="https://upload.wikimedia.org/wikipedia/commons/1/1f/SMirC-thumbsup.svg"> Download Image </a>
   </div>
</body>
</html>


2
vui lòng bổ sung thêm chi tiết, ví dụ như nơi mã này có thể được sử dụng.
Maciej S.

-2

Còn việc sử dụng hàm .click () và thẻ thì sao?

(Phiên bản nén)

<a id="downloadtag" href="examplefolder/testfile.txt" hidden download></a>

<button onclick="document.getElementById('downloadtag').click()">Download</button>

Bây giờ bạn có thể kích hoạt nó với js. Nó cũng không mở, như các ví dụ khác, các tệp hình ảnh và văn bản!

(phiên bản js-function)

function download(){
document.getElementById('downloadtag').click();
}
<!-- HTML -->
<button onclick="download()">Download</button>
<a id="downloadtag" href="coolimages/awsome.png" hidden download></a>


-4

Tôi thấy rằng

<a href="link/to/My_Image_File.jpeg" download>Download Image File</a>

không làm việc cho tôi. Tôi cung không chăc tại sao.

Tôi thấy rằng bạn có thể bao gồm một ?download=true tham số ở cuối liên kết của mình để buộc tải xuống. Tôi nghĩ rằng tôi nhận thấy kỹ thuật này đang được sử dụng bởi Google Drive.

Trong liên kết của bạn, bao gồm ?download=trueở cuối href của bạn.

Bạn cũng có thể sử dụng kỹ thuật này để đặt tên tệp cùng một lúc.

Trong liên kết của bạn, hãy bao gồm ?download=true&filename=My_Image_File.jpegở cuối href của bạn.


2
? download = true được chuyển tới Google Drive để yêu cầu máy chủ của họ gửi tiêu đề chính xác để tải hình ảnh xuống. Nó không phải là thứ có thể hoạt động trong bất kỳ môi trường nào khác trừ khi nó được thiết lập cụ thể theo cách đó.
muncherelli 10/09/16

-15

Bạn không cần phải viết js để làm điều đó, chỉ cần sử dụng:

<a href="path_to/image.jpg" alt="something">Download image</a>

Và chính trình duyệt sẽ tự động tải hình ảnh xuống.

Nếu vì lý do nào đó mà nó không hoạt động, hãy thêm thuộc tính tải xuống. Với thuộc tính này, bạn có thể đặt tên cho tệp có thể tải xuống:

<a href="path_to/image.jpg" download="myImage">Download image</a>

Liên kết đến hình ảnh sẽ chỉ mở hình ảnh trong cùng một cửa sổ, trừ khi trình duyệt của bạn được định cấu hình khác. Các downloadthuộc tính không được hỗ trợ trong tất cả các trình duyệt.
Thiết kế bởi Adrian
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.