Идея написания: закодировать локальный файл с помощью base64 на клиенте, а затем отправить его по назначению.
Во время теста загруженный файл был слишком большим, что привело к тайм-ауту и сбою.
Позже его доработали. Кодировка отправлялась сегментами. Тест 20М прошел успешно.
Цель написания: В традиционном решении можно выбирать и загружать по одному. Однако сложнее читать пути к файлам в базе данных и загружать эти файлы в одно место.
Конечно, можно использовать ftp для поиска путей один за другим, но каждый раз поиск этих файлов будет занимать у меня больше времени. Целью написания этого здесь является в основном получение файлов по пути к файлу в базе данных и загрузка файлов в одно место пакетами за раз.
Основная цель – тренировать себя.
Процесс решения: Сначала я пытался использовать имитацию ввода с клавиатуры, чтобы принудительно присвоить значения элементу управления файлом и загрузить его традиционным методом. Но я всегда сталкиваюсь с нулевыми значениями, и даже многие файлы не отправляются. Изучив некоторую информацию, теперь я извлекаю все пути через базу данных и записываю их в js. Затем используйте js на стойке регистрации, чтобы прочитать эти пути и отправить файл через xmlhttp.
Поскольку Internet Explorer не очень любит xmlHttp и всегда считает его вредоносным, поэтому всегда выдает предупреждения. Поэтому вы не можете использовать веб-путь во время работы. Для доступа к нему можно использовать только физический путь.
Затем на сервере есть файл для получения этих кодировок и их декодирования. Я называю его c/s.
В настоящее время многие кодексы все еще совершенствуются.
Краткое введение:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
Вот путь к файлу и файл. Их может быть несколько.
В дальнейшем этот путь можно будет получить и на клиенте через файловый контроль.
http://www.xxx.com/xxx/xxx.asp
Это пункт назначения, вы можете изменить его на нужный вам адрес.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename Вот файл для чтения.
server.mappath(.) &/& Путь соответствует пути к хранилищу
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& Это путь для хранения файла. str_filename — имя файла.
Чтение и хранение здесь размещаются в каталоге, где находится программа. Так же можно сохранить при тестировании.
Поместите первый фрагмент кода локально (например: c:/upload.htm).
Поместите второй фрагмент кода на сервер, который может быть локальным или общедоступным сервером. Соблюдайте указанное выше назначение.
(например: http://www.xxx.com/upload.asp или http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
Действие: Найдите, где сохранен первый фрагмент кода. Просто выполните его (например: откройте диск c и выполните upload.htm)
Клиентский код</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles(); value=Send/> <input type=button onclick=JavaScript: Breaked= true ; value=interrupt/> <div id=ddd width=300px></div> </br> <DIV id=div_message></DIV></body></P><P><script Language=VBScript>Функция bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i) ,1)) Если ThisCharCode < &H80 Тогда strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = функция strReturnEnd</script></P ><P><script Language=JavaScript> вар xmlhttp; вар ado_stream; вар mFileName, mPartStart, mPartID, mPartEnd; var SendCount; var BlockSize; var Breaked; var aryFiles;</P><P> BlockSize = 1024*100; //Количество байтов, отправляемых каждый разBreaked = false; aryFiles = new Array();</ P> P><P> // Начинаем отправку файлов function BeginSendFiles() { initAryFiles(); } // Создаем массив файлов для отправки function initAryFiles() { aryFiles.push(c://aaa.zip) ; aryFiles.push(c://bbb.exe) ;//c://aaa. zip c ://bbb.exe локальный файл aryFiles.reverse() ;//Имя файла</P><P> function SendFile(vFullPath) { // Пустой файл не будет загружен, если (!vFullPath) { return ; } Breaked = false ; div_message.innerHTML = ; ado_stream = new ActiveXObject(ADODB.Stream); // Чтение потока файлов ado_stream.Open(); ); // Читаем файл ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // Если есть остаток, отправить еще раз</P><P> // alert(SendCount) ;</P><P> var reg = //b /w+. /w+$/gi mFileName = reg.exec(vFullPath) ; mPartStart = true ; mPartID = 1 ; mPartEnd = false ; SendData() ; { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument // Отправляем XML-файл dom.async = false; dom.resolveExternals = false;</P><P> // Создаем заголовок XML-файла var); node = dom.createProcessingInstruction(xml,version='1.0'); dom.appendChild(node); // узел; Создание корневого узла var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); // Создание обновленных данных узла для сохранения. узел двоичных данных = dom.createElement(upData); node.dataType = bin.base64; // bin. кодировка base64 var att = dom.createAttribute(FileName); // Атрибут имени файла att.value = mFileName; node.setAttributeNode(att); att = null; var att = dom.createAttribute(PartStart); // Метка начала раздела att; .value = mPartStart; node.setAttributeNode(att); att = null; var att = dom.createAttribute(PartID); Номер раздела att.value = mPartID; node.setAttributeNode(att); att = null; var att = dom.createAttribute(PartEnd); // Метка конца раздела att.value = mPartEnd; node.setAttributeNode(att); ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize); // Данные узла считываются из потока фиксированной длины node = null; SendCount -= 1; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP); false); //http://www.xxx.com/xxx/xxx.asp — это файл по веб-пути xmlhttp.onreadystatechange= CallBack; xmlhttp.send(dom); mPartStart = false; = null ; } else { ado_stream.Close(); ado_stream = null ; } } function CallBack() { // Загрузка успешна if(xmlhttp.readystate == 4) { // Проверяем, прервана ли загрузка if(Breaked) { return </P><P> if (SendCount > 0) { mPartID += 1; // div_message.innerHTML += ( + xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; // Вычисляем процент прогрессаShowBar(p) ; var t = setTimeout(SendData ( );, 1) ; } else { // Завершена передача файла //div_message.innerHTML += mFileName + Перенос завершен! ;</P><P> // Продолжаем передавать следующий файл ShowBar(0) ; var cFile = aryFiles.pop() ; SendFile(cFile) } } </P><P> </P><; P > function ShowBar(per) { // Индикатор выполнения ddd.innerHTML = <table width='200' border=0 cellpadding='0' cellpacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:0px; background:#005599; color:#FFFFFF' value= + per + %> </td></tr ></таблица> </P><P></script></html></P><P>
серверная часть
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' Определите переменные и объекты. dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' Создать набор объектов Stream ado_stream = Server.CreateObject(ADODB.Stream)' Создать объект XMLDOM из набора объектов Request xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' Считайте узел, содержащий набор двоичных данных xml_data = xml_dom.selectSingleNode(root/upData)str_filename = xml_data.getAttribute(FileName)bol_PartStart = CBool(xml_data.getAttribute(PartStart) ))int_PartID = CInt(xml_data.getAttribute(PartID))bol_PartEnd = CBool(xml_data.getAttribute(PartEnd))</P><P>' Откройте объект Stream и сохраните в нем данные ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open если не bol_PartStart, то ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' Прочитайте файл ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' Сохраните файл ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Save file 2=adSaveCreateOverWrite ado_stream.close </P><P> «Освободить ресурсы установлено ado_stream = Ничего не установлено xml_dom = Ничего» Вернуть информацию в браузер. Response.Write Загрузка успешна!& str_filename & int_PartID & bol_PartStart%> </P><P>