Λήψη αρχείου χρησιμοποιώντας Javascript/jQuery

Έχω μια πολύ παρόμοια απαίτηση που καθορίζεται εδώ.

Πρέπει να έχω το πρόγραμμα περιήγησης του χρήστη'να ξεκινήσει μια λήψη χειροκίνητα όταν $('a#someID').click();

Αλλά δεν μπορώ να χρησιμοποιήσω τη μέθοδο window.href, αφού αντικαθιστά τα τρέχοντα περιεχόμενα της σελίδας με το αρχείο που προσπαθείς να κατεβάσεις.

Αντ' αυτού θέλω να ανοίξω τη λήψη σε νέο παράθυρο/καρτέλα. Πώς είναι αυτό δυνατό;

Λύση

Χρησιμοποιήστε ένα αόρατο <iframe>:


<script>
function Download(url) {
    document.getElementById('my_iframe').src = url;
};
</script>

Για να αναγκάσετε το πρόγραμμα περιήγησης να κατεβάσει ένα αρχείο που διαφορετικά θα ήταν ικανό να αποδώσει (όπως αρχεία HTML ή κειμένου), θα πρέπει ο διακομιστής να ορίσει τον MIME Type του αρχείου σε μια μη λογική τιμή, όπως application/x-please-download-me ή εναλλακτικά application/octet-stream, που χρησιμοποιείται για αυθαίρετα δυαδικά δεδομένα.

Αν θέλετε να το ανοίξετε μόνο σε μια νέα καρτέλα, ο μόνος τρόπος για να το κάνετε αυτό είναι να κάνει ο χρήστης κλικ σε έναν σύνδεσμο με το χαρακτηριστικό target να έχει οριστεί σε _blank.

Στην jQuery:

$('a#someID').attr({target: '_blank', 
                    href  : 'http://localhost/directory/file.pdf'});

Κάθε φορά που γίνεται κλικ σε αυτόν τον σύνδεσμο, θα κατεβάζει το αρχείο σε νέα καρτέλα/παράθυρο.

Σχόλια (21)

ενημέρωση για τα σύγχρονα προγράμματα περιήγησης του 2019

Αυτή είναι η προσέγγιση που θα συνιστούσα τώρα με μερικές επιφυλάξεις:

  • Απαιτείται ένα σχετικά σύγχρονο πρόγραμμα περιήγησης
  • Εάν το αρχείο αναμένεται να είναι πολύ μεγάλο, θα πρέπει πιθανότατα να κάνετε κάτι παρόμοιο με την αρχική προσέγγιση (iframe και cookie), επειδή ορισμένες από τις παρακάτω λειτουργίες θα μπορούσαν πιθανότατα να καταναλώσουν μνήμη συστήματος τουλάχιστον τόσο μεγάλη όσο και το αρχείο που κατεβαίνει ή/και άλλες ενδιαφέρουσες παρενέργειες της CPU.
Σχόλια (10)

Αν χρησιμοποιείτε ήδη την jQuery, μπορείτε να την εκμεταλλευτείτε για να δημιουργήσετε ένα μικρότερο απόσπασμα Μια jQuery έκδοση της απάντησης του Andrew's:

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
//... How to use it:
downloadURL('http://whatever.com/file.pdf');
Σχόλια (7)