Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ActiveX FileSystemObject - проблемы с чтением бинарного файла и отправкой (https://javascript.ru/forum/misc/26839-activex-filesystemobject-problemy-s-chteniem-binarnogo-fajjla-i-otpravkojj.html)

oleg40 24.03.2012 12:55

ActiveX FileSystemObject - проблемы с чтением бинарного файла и отправкой
 
Уже голову сломал.
Используется ActiveX FileSystemObject в IE.
Нужно прочитать файл на клиенте и передать его содержимое.
Всё круто когда обычные файлы.
Когда же бинарные файлы то он ерунду мне отправляет (не понимает чтоли некоторые символы и вместо них нули), причем длина пост-запроса каждый раз разная.

Скажите, реально ли вообще такое проворачивать - если да то как - если нет то почему???
Умеет ли вообще javascript работать с бинарными данными???

Пользуюсь таким кодом:

function readFile(input)
{
	var fs = new ActiveXObject("Scripting.FileSystemObject");
	var file = fs.GetFile(input.value);
	var stream = file.OpenAsTextStream(1, 0);
	var content = stream.ReadAll();
	stream.Close();
	return content;
}

function send(url, inputName, filename, content, callBack)
{
	var boundary = "xxxxxxxxx";

	var body = "--" + boundary + "\r\n";
	body += "Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + filename + "\"\r\n";
	body += "Content-Type: application/octet-stream\r\n\r\n";
	body += content + "\r\n";
	body += "--" + boundary + "--";

	var req = new XMLHttpRequest();
	req.open("POST", url, true);
	req.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
	req.onreadystatechange = function ()
	{
		if (req.readyState == 4)
			if (req.status == 200)
				if (callBack)
					callBack();
	};

	req.send(body);
}

GuardCat 24.03.2012 13:39

Посмотрите тут. Вроде то что вам нужно.

oleg40 24.03.2012 15:47

Я пробывал уже этот код.
function GetBinaryFile(PathToFile)
{
    var stream = new ActiveXObject("ADODB.Stream");
    stream.type = 1;  // Binary mode
    stream.Open();
    stream.LoadFromFile(PathToFile);
    var GetFile = stream.Read();
    stream.Close();
    return GetFile;
}

Но stream.Read() почему то мне ничего не возвращает - мож из-за того что ось win7.

lord2kim 26.04.2012 14:55

этот объект вроде еще нужно активировать

function activate() {
	var sh = new ActiveXObject('WScript.Shell');
	var CurrentLevel = sh.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3\\CurrentLevel");
	var Flags = sh.RegRead("HKLM\\SOFTWARE\\Microsoft\\Internet Explorer\\ActiveX Compatibility\\{00000566-0000-0010-8000-00AA006D2EA4}\\Compatibility Flags");
	try {
		sh.RegWrite("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\3\\CurrentLevel", "73728", "REG_DWORD");
		sh.RegWrite("HKLM\\SOFTWARE\\Microsoft\\Internet Explorer\\ActiveX Compatibility\\{00000566-0000-0010-8000-00AA006D2EA4}\\Compatibility Flags", "0", "REG_DWORD");
	}
	catch (e) {
		alert("Ошибка "+e.number+": "+e.description+"\nВозможно у вас нет прав для редактирования реестра или данной директории не существует!");
	}
}

в качестве manual-a

function GetBinaryFile (PathToFile) {
	try {
		var stream = new ActiveXObject("ADODB.Stream");
		stream.Open();
		stream.Type = 1; // Binary file is encoded
		stream.LoadFromFile(PathToFile);
		
		var XML = new ActiveXObject("Microsoft.XMLDOM");
		var DocElem = XML.createElement("Base64Data");
		DocElem.dataType = "bin.base64";
		DocElem.nodeTypedValue = Stream.Read();
	
		return DocElem.text;
	}
	catch (e) {
		return "Ошибка: "+e.number+" -> "+e.description;
	}
}

oleg40 26.04.2012 18:53

Спасибо

Tim 20.07.2013 02:17

Ещё можно читать фай по частям если он большой
http://www.html5rocks.com/ru/tutorials/file/dndfiles/

Обрабатывать кусочки ф-й base64_encode
http://javascript.ru/php/base64_encode

и передавать по сети


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