2014-09-02 67 views
9

我想給我的網站上的用戶下載一個「lnk」文件的能力。 我的想法是生成這個文件來包含一個只能使用一次的地址。 有沒有辦法在JavaScript中生成此文件? 流程是一樣的東西 -有沒有使用javascript創建lnk文件的方法

  1. 用戶按下一個按鈕
  2. 的JavaScript生成此文件,並將其下載到用戶的機器
  3. 用戶發送該文件給其他用戶使用該一次性從他的機器地址

是這樣的東西是可以在客戶端JavaScript?或者我需要使用java服務器端來生成這個文件?

+0

檢查這個http://www.codeproject.com/Articles/55488/File-Download-Using-JavaScript – mck 2014-09-02 11:21:56

+1

@Cory確保它 - 看看'Blob',你可以在JS中創建任意文件並將它們下載到計算機中。 – 2014-09-02 11:22:07

+0

指定了文件格式,但並非完全無關緊要:http://msdn.microsoft.com/zh-cn/library/dd871305.aspx。 – kay 2014-09-02 11:24:57

回答

5

這是mslink.sh的忠實翻譯。

我只在Windows 8.1中測試了我的答案,但我認爲它也適用於較舊版本的Windows。

function create_lnk_blob(lnk_target) { 
    function hex_to_arr(s) { 
     var result = Array(s.length/2); 
     for (var i = 0; i < result.length; ++i) { 
      result[i] = +('0x' + s.substr(2*i, 2)); 
     } 
     return result; 
    } 

    function str_to_arr(s) { 
     var result = Array(s.length); 
     for (var i = 0; i < s.length; ++i) { 
      var c = s.charCodeAt(i); 
      if (c >= 128) { 
       throw Error("Only ASCII paths are suppored :-("); 
      } 
      result[i] = c; 
     } 
     return result; 
    } 

    function convert_CLSID_to_DATA(s) { 
     var idx = [[6,2], [4,2], [2,2], [0,2], 
        [11,2], [9,2], [16,2], [14,2], 
        [19,4], [24,12]]; 
     var s = idx.map(function (ii) { 
      return s.substr(ii[0], ii[1]); 
     }); 
     return hex_to_arr(s.join('')); 
    } 

    function gen_IDLIST(s) { 
     var item_size = (0x10000 + s.length + 2).toString(16).substr(1); 
     return hex_to_arr(item_size.replace(/(..)(..)/, '$2$1')).concat(s); 
    } 

    var HeaderSize = [0x4c, 0x00,0x00,0x00], 
     LinkCLSID = convert_CLSID_to_DATA("00021401-0000-0000-c000-000000000046"), 
     LinkFlags = [0x01,0x01,0x00,0x00], // HasLinkTargetIDList ForceNoLinkInfo 

     FileAttributes_Directory = [0x10,0x00,0x00,0x00], 
     FileAttributes_File = [0x20,0x00,0x00,0x00], 

     CreationTime = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00], 
     AccessTime = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00], 
     WriteTime = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00], 

     FileSize = [0x00,0x00,0x00,0x00], 
     IconIndex = [0x00,0x00,0x00,0x00], 
     ShowCommand = [0x01,0x00,0x00,0x00], //SW_SHOWNORMAL 
     Hotkey = [0x00,0x00], // No Hotkey 
     Reserved = [0x00,0x00], 
     Reserved2 = [0x00,0x00,0x00,0x00], 
     Reserved3 = [0x00,0x00,0x00,0x00], 
     TerminalID = [0x00,0x00], 

     CLSID_Computer = convert_CLSID_to_DATA("20d04fe0-3aea-1069-a2d8-08002b30309d"), 
     CLSID_Network = convert_CLSID_to_DATA("208d2c60-3aea-1069-a2d7-08002b30309d"), 

     PREFIX_LOCAL_ROOT = [0x2f], 
     PREFIX_FOLDER = [0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00], 
     PREFIX_FILE = [0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00], 
     PREFIX_NETWORK_ROOT = [0xc3,0x01,0x81], 
     PREFIX_NETWORK_PRINTER = [0xc3,0x02,0xc1], 

     END_OF_STRING = [0x00]; 

    if (/.*\\+$/.test(lnk_target)) { 
     lnk_target = lnk_target.replace(/\\+$/g, ''); 
     var target_is_folder = true; 
    } 

    var prefix_root, item_data, target_root, target_leaf; 
    if (lnk_target.substr(0, 2) === '\\\\') { 
     prefix_root = PREFIX_NETWORK_ROOT; 
     item_data = [0x1f, 0x58].concat(CLSID_Network); 
     target_root = lnk_target.subtr(lnk_target.lastIndexOf('\\')); 
     if (/\\\\.*\\.*/.test(lnk_target)) { 
      target_leaf = lnk_target.substr(lnk_target.lastIndexOf('\\') + 1); 
     } 
     if (target_root === '\\') { 
      target_root = lnk_target; 
     } 
    } else { 
     prefix_root = PREFIX_LOCAL_ROOT; 
     item_data = [0x1f, 0x50].concat(CLSID_Computer); 
     target_root = lnk_target.replace(/\\.*$/, '\\'); 
     if (/.*\\.*/.test(lnk_target)) { 
      target_leaf = lnk_target.replace(/^.*?\\/, ''); 
     } 
    } 

    var prefix_of_target, file_attributes; 
    if (!target_is_folder) { 
     prefix_of_target = PREFIX_FILE; 
     file_attributes = FileAttributes_File; 
    } else { 
     prefix_of_target = PREFIX_FOLDER; 
     file_attributes = FileAttributes_Directory; 
    } 

    target_root = str_to_arr(target_root); 
    for (var i = 1; i <= 21; ++i) { 
     target_root.push(0); 
    } 

    var id_list_items = gen_IDLIST(item_data); 
    id_list_items = id_list_items.concat(
      gen_IDLIST(prefix_root.concat(target_root, END_OF_STRING))); 
    if (target_leaf) { 
     target_leaf = str_to_arr(target_leaf); 
     id_list_items = id_list_items.concat(
       gen_IDLIST(prefix_of_target.concat(target_leaf, END_OF_STRING))); 
    } 
    var id_list = gen_IDLIST(id_list_items); 

    var data = [].concat(HeaderSize, 
         LinkCLSID, 
         LinkFlags, 
         file_attributes, 
         CreationTime, 
         AccessTime, 
         WriteTime, 
         FileSize, 
         IconIndex, 
         ShowCommand, 
         Hotkey, 
         Reserved, 
         Reserved2, 
         Reserved3, 
         id_list, 
         TerminalID); 
    return new Blob([new Uint8Array(data)], { type: 'application/x-ms-shortcut' }); 
} 

var blob = create_lnk_blob('C:\\Windows\\System32\\Calc.exe'); 

這樣使用它:

var blob_to_file = create_lnk_blob('C:\\Windows\\System32\\Calc.exe'); 
var blob_to_folder = create_lnk_blob('C:\\Users\\Myself\\Desktop\\'); // with a trailing slash 

演示:http://jsfiddle.net/5cjgLyan/2/

+0

這是我找到的最好的解決方案,但瀏覽器似乎討厭.lnk文件(我也嘗試生成lnk文件服務器端) – EKS 2017-08-07 15:09:39

-3

我覺得讓它純粹的客戶端是不可能的。 即使網絡rtc協議也需要至少一個iceServer來向其他客戶端發送信號。

而且我認爲這樣做最簡單的方法是使用http://peerjs.com/

,你可以先創建房間的主人

//room owner side 
peer.on('open', function(my_peer_id) { 
    console.log('My peer ID is: ' + my_peer_id); 
}); 

的客戶爲例令牌發送令牌給你想要的任何其他(通過短信文件,網絡聊天...等)

然後其他連接它使用上面

//the other one 
var conn = peer.connect(other_peer_id); 
令牌

房間主人發現有人進入房間後。

從信號服務器斷開,所以令牌將變得不可用

//room owner side 
peer.disconnect() 

關於生成和讀取客戶端文件,我建議你閱讀下面文章。

  1. http://www.html5rocks.com/en/tutorials/file/dndfiles/從文件
  2. How to use filesaver.js讀另存爲文件

相信的FileReader API和Blob的兼容性並不重要。 由於永遠不會有支持webrtc但不支持fileReader api的瀏覽器

-1

如果您的網站允許使用php,這將會很簡單。

如果您的腳本是html文件的一部分,只需編寫javascript,就好像您正在編寫它以發送靜態lnk文件一樣。然後,在lnk地址部分,將JavaScript分成兩部分,分成html。然後,在這一點上,放在

<?php /*PHP code set a variable *? /* PHP code to generate proper string*/ PRINT /*PHP variable*/ 
?> 
相關問題