我想給我的網站上的用戶下載一個「lnk」文件的能力。 我的想法是生成這個文件來包含一個只能使用一次的地址。 有沒有辦法在JavaScript中生成此文件? 流程是一樣的東西 -有沒有使用javascript創建lnk文件的方法
- 用戶按下一個按鈕
- 的JavaScript生成此文件,並將其下載到用戶的機器
- 用戶發送該文件給其他用戶使用該一次性從他的機器地址
是這樣的東西是可以在客戶端JavaScript?或者我需要使用java服務器端來生成這個文件?
我想給我的網站上的用戶下載一個「lnk」文件的能力。 我的想法是生成這個文件來包含一個只能使用一次的地址。 有沒有辦法在JavaScript中生成此文件? 流程是一樣的東西 -有沒有使用javascript創建lnk文件的方法
是這樣的東西是可以在客戶端JavaScript?或者我需要使用java服務器端來生成這個文件?
這是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
這是我找到的最好的解決方案,但瀏覽器似乎討厭.lnk文件(我也嘗試生成lnk文件服務器端) – EKS 2017-08-07 15:09:39
我覺得讓它純粹的客戶端是不可能的。 即使網絡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()
關於生成和讀取客戶端文件,我建議你閱讀下面文章。
相信的FileReader API和Blob的兼容性並不重要。 由於永遠不會有支持webrtc但不支持fileReader api的瀏覽器
如果您的網站允許使用php,這將會很簡單。
如果您的腳本是html文件的一部分,只需編寫javascript,就好像您正在編寫它以發送靜態lnk文件一樣。然後,在lnk地址部分,將JavaScript分成兩部分,分成html。然後,在這一點上,放在
<?php /*PHP code set a variable *? /* PHP code to generate proper string*/ PRINT /*PHP variable*/
?>
檢查這個http://www.codeproject.com/Articles/55488/File-Download-Using-JavaScript – mck 2014-09-02 11:21:56
@Cory確保它 - 看看'Blob',你可以在JS中創建任意文件並將它們下載到計算機中。 – 2014-09-02 11:22:07
指定了文件格式,但並非完全無關緊要:http://msdn.microsoft.com/zh-cn/library/dd871305.aspx。 – kay 2014-09-02 11:24:57