Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамическое создание текстовых файлов (https://javascript.ru/forum/misc/31087-dinamicheskoe-sozdanie-tekstovykh-fajjlov.html)

Bebarr Swallow 26.08.2012 20:16

Динамическое создание текстовых файлов
 
Стоит задача динамично генерировать плейлисты (текстовые файлы), с участием самого JavaScript.

Есть заготовка (первая попытка):
<a href="#" id="dlLink" download="playlist.m3u">Download playlist</a>

<script>
window.URL = window.webkitURL || window.URL;
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;

var bb = new BlobBuilder();
bb.append("file content");

dlLink.onmouseover = function() {
  this.href = window.URL.createObjectURL(bb.getBlob("text/plain"));
}
</script>


Хочу услышать предложения по улучшению скрипта.

Aetae 26.08.2012 20:23

Хе-хе, пару дней назад подобную чтуку написал для ff для генерации плейлиста с ftp(чтоб напрямую через vlc слушать);
Воспользовался просто base64 и dataURL.

Минус - везде кроме хрома имя файла не задашь.

Bebarr Swallow 26.08.2012 20:41

Aetae, точно же! Вот я дурень, что сразу не догадался.

Bebarr Swallow 26.08.2012 21:14

Конечный вариант:
<a href="#" id="dlLink" download="playlist.m3u">Download playlist</a>

<script>
/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(c){for(var a="",d,b,f,g,h,e,i=0,c=Base64._utf8_encode(c);i<c.length;)d=c.charCodeAt(i++),b=c.charCodeAt(i++),f=c.charCodeAt(i++),g=d>>2,d=(d&3)<<4|b>>4,h=(b&15)<<2|f>>6,e=f&63,isNaN(b)?h=e=64:isNaN(f)&&(e=64),a=a+this._keyStr.charAt(g)+this._keyStr.charAt(d)+this._keyStr.charAt(h)+this._keyStr.charAt(e);return a},decode:function(c){for(var a="",d,b,f,g,h,e=0,c=c.replace(/[^A-Za-z0-9\+\/\=]/g,"");e<c.length;)d=this._keyStr.indexOf(c.charAt(e++)),b=this._keyStr.indexOf(c.charAt(e++)),g=this._keyStr.indexOf(c.charAt(e++)),h=this._keyStr.indexOf(c.charAt(e++)),d=d<<2|b>>4,b=(b&15)<<4|g>>2,f=(g&3)<<6|h,a+=String.fromCharCode(d),64!=g&&(a+=String.fromCharCode(b)),64!=h&&(a+=String.fromCharCode(f));return a=Base64._utf8_decode(a)},_utf8_encode:function(c){for(var c=c.replace(/\r\n/g,"\n"),a="",d=0;d<c.length;d++){var b=c.charCodeAt(d);128>b?a+=String.fromCharCode(b):(127<b&&2048>b?a+=String.fromCharCode(b>>6|192):(a+=String.fromCharCode(b>>12|224),a+=String.fromCharCode(b>>6&63|128)),a+=String.fromCharCode(b&63|128))}return a},_utf8_decode:function(c){for(var a="",d=0,b=c1=c2=0;d<c.length;)b=c.charCodeAt(d),128>b?(a+=String.fromCharCode(b),d++):191<b&&224>b?(c2=c.charCodeAt(d+1),a+=String.fromCharCode((b&31)<<6|c2&63),d+=2):(c2=c.charCodeAt(d+1),c3=c.charCodeAt(d+2),a+=String.fromCharCode((b&15)<<12|(c2&63)<<6|c3&63),d+=3);return a}};
</script>

<script>
dlLink.href = "data:audio/x-mpegurl;base64," + Base64.encode("file content");
</script>

Bebarr Swallow 26.08.2012 21:14

Ой.. кажется я сломал форум :D

Aetae 26.08.2012 22:17

Лучше не text/plain, а mime-type плелиста, чтоб в браузерах кроме хрома не открывалось в новом окне, а предлагало скачать или открыть плеером. Например m3u - это audio/x-mpegurl.

Bebarr Swallow 26.08.2012 22:48

Цитата:

Сообщение от Aetae (Сообщение 200685)
Лучше не text/plain, а mime-type плелиста, чтоб в браузерах кроме хрома не открывалось в новом окне, а предлагало скачать или открыть плеером. Например m3u - это audio/x-mpegurl.

Дельный совет, спасибо!


Часовой пояс GMT +3, время: 03:24.