Аннотация: В этой статье представлены два метода JavaBean для реализации нескольких загрузок файлов, используя протокол http и протокол ftp соответственно. Сначала описывается базовый формат передачи нескольких файлов по протоколу http и подробный процесс загрузки. Затем кратко описывается использование класса ftpclient для реализации загрузки по FTP и, наконец, сравниваются два метода.
Ключевые слова: JavaBean, http, ftp, ftpclient
JavaBean — это программный компонент на основе Java. JSP обеспечивает полную поддержку интеграции компонентов JavaBean в веб-приложения. Эта поддержка не только сокращает время разработки (вы можете напрямую использовать существующие компоненты, которые были протестированы и заслуживают доверия, избегая повторной разработки), но также обеспечивает большую масштабируемость приложений JSP.
Функция загрузки файлов очень распространена в модели разработки на основе B/S. По сравнению с другими инструментами разработки, поддержка загрузки файлов в JSP не идеальна. Она не требует завершения работы компонентов, как ASP, и не обеспечивает прямую поддержку загрузки файлов, как PHP. JSP реализует загрузку файлов следующим образом: используйте метод getInputStream() класса ServletRequest для получения потока данных, отправленного клиентом на сервер, а затем обработайте этот поток данных для анализа и получения различных параметров и параметров, передаваемых в сервер во время загрузки данных файла, а затем сохраните данные файла в нем в виде файла или вставьте его в базу данных. Обычно страницы JSP не обрабатывают функцию загрузки файлов, а помещают эти функции в сервлеты или JavaBeans для реализации. Примеры использования сервлета для завершения загрузки файлов представлены в некоторых книгах, посвященных JSP. Здесь я расскажу, как использовать JeanBean для завершения загрузки файлов. Существует два способа загрузки файлов в JSP, а именно протокол HTTP и протокол FTP. Между ними существуют большие различия в принципах передачи. Ниже будет дано краткое введение в их реализацию на основе исходного кода. Я уверен, что читатели получат от этого какую-то пользу. Следующая программа была отлажена и принята. Среда отладки: сервер Windows 2000+Apache +tomcat4.0, среда отладки JavaBean: JDK1.4+Editplus.
Использование JavaBean в JSP для реализации функции загрузки файлов через Интернет обычно требует комбинации трех типов файлов. Эти три файла представляют собой соответственно файл страницы HTML, предоставляющий интерфейс, файл JSP, который завершает вызов для реализации функции загрузки JavaBean, и файл класса Java, реализующий JavaBean. Ниже я сосредоточусь на части JavaBean, которая использует протокол HTTP и протокол FTP для реализации функции загрузки файлов.
1. Используйте протокол HTTP для загрузки нескольких файлов.
В прошлом HTML-формы не могли загружать файлы, что несколько ограничивало функции некоторых веб-страниц. Спецификация RFC1867 (то есть загрузка файлов на основе формы в HTML) расширяет форму и добавляет элемент формы . Используя этот элемент, браузер автоматически создаст поле ввода и кнопку. Поле ввода позволяет пользователю ввести имя локального файла и путь, а кнопка позволяет браузеру открыть окно выбора файла, чтобы пользователь мог его выбрать. выберите файл. Конкретная реализация формы следующая:
Если вы решите вставить файл, введите абсолютный путь к локальному файлу. Значение атрибута действия формы — *.jsp, что означает, что запрос (включая загруженный файл) будет отправлен на сервер. *..jsp-файл. В этом процессе фактически реализуется загрузка файлов по HTTP. Загрузка файлов с клиента на сервер поддерживается Common Gateway Interface (CGI) протокола HTTP. Для этого метода загрузки требуется, чтобы браузер и веб-сервер поддерживали Rfc1867. JavaBean получает поток данных, отправленный клиентом на сервер через метод getInputStream() класса ServletRequest, анализирует формат загруженного файла и последовательно выводит несколько файлов в целевой файл на стороне сервера на основе результатов анализа. Функция JavaBeande в этом примере специально реализована классом testUpload. Структура класса TestUpload выглядит следующим образом:
общедоступный класс testUpload
{
публичный testUpload(){……}
public Final void Initialize (конфигурация ServletConfig) выдает ServletException
{ m_application = config.getServletContext();
public void upload() выдает testUploadException, IOException, ServletException
{…………}
частная пустота getDataSection() {………}
Private void getDataHeader(){………}
общедоступное сохранение int (String destPathName)
выдает SmartUploadException, IOException, ServletException
{…………}
…
}
Инициализируйте рабочую среду сервлета с помощью метода инициализации(). Используйте метод upload() для получения входного потока, анализа формата загруженного файла и назначения атрибутов каждого загруженного файла нескольким экземплярам класса File для обработки. Эти экземпляры класса File управляются классом Files. Класс File вызывает свой метод save() в соответствии с атрибутами каждого файла для последовательного вывода нескольких файлов в целевой файл на стороне сервера. Метод upload() является ключевым и используется для анализа формата файлов, передаваемых по протоколу http1.1. После тестирования мы получаем формат файла транспортного потока, который полезен для понимания метода upload(). Например, загрузите файл Мои документыtt.txt. Формат следующий:
//Разделитель файлов.
--------------------------7d226137250336
//Заголовок информации о файле
Content-Disposition: form-data; name="FILE1"; filename="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documentstt.sql"
Тип контента: текстовый/обычный
//Содержимое исходного файла
создать информацию о таблице(
изображение контента null);
//Разделитель следующего файла
--------------------------7d226137250336
Content-Disposition: имя-файла = "FILE2";
Тип контента: приложение/октет-поток
--------------------------------7d226137250336
Из приведенных выше файлов мы видим, что при загрузке нескольких файлов протокол HTTP Все помещаются во входной поток и выделяются определенными разделителями. Фактически, метод upload() предназначен для анализа вышеуказанного файла и определения содержимого разделителя, формата содержимого каждого файла, полного пути к файлу, а также начала и конца фактических данных файла. Здесь следует отметить, что разделитель является случайным, это все символы до первого символа возврата каретки в файле транспортного потока.
Процесс реализации метода Upload() заключается в следующем: сначала выведите файл входного потока в массив байтов m_binArray, который реализуется с помощью следующего кода.
m_totalBytes = 1024; TotalRead = 0;
for(; totalRead < m_totalBytes; totalRead += readBytes)
пытаться
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}catch(Exception e){ throw new SmartUploadException("Невозможно загрузить.");}
Здесь используется метод многобайтового чтения в цикле. Приведенный выше цикл непрерывно считывает данные до тех пор, пока массив не заполнится. Если файл может быть получен полностью, все байты файла также могут быть получены. Но поскольку скорость сети обычно намного ниже, чем у процессора, программе легко очистить сетевой буфер до того, как поступят все данные. Фактически, метод многобайтового чтения вернет 0 при попытке прочитать данные из временно пустого, но открытого сетевого буфера, а это означает, что данных не существует, но сетевой поток не был закрыт. В этом случае однобайтовый метод предотвратит выполнение запущенной программы, поэтому поведение многобайтового метода лучше, чем поведение однобайтового метода read(). Далее будет проанализирован массив байтов m_binArray. Сначала найдите разделитель; используйте метод getDataHeader(), чтобы вернуть значение заголовка информации о файле, из которого определяются полный путь к исходному файлу, расширение исходного файла и формат содержимого исходного файла, используя getDataSection(); метод для возврата данных содержимого файла и их записи. Начальная и конечная позиции данных файла в массиве байтов. Затем создайте экземпляр класса File и поместите полный путь к файлу, расширение исходного файла, формат содержимого исходного файла, а также начальную и конечную позиции данных содержимого файла в атрибуты экземпляра класса File. Найдите следующий разделитель и продолжайте повторять описанный выше процесс, пока анализ не будет завершен.
2. Используйте протокол FTP для загрузки нескольких файлов.
Протокол FTP — это протокол, используемый для передачи файлов в Интернете. Он определяет стандарты взаимной передачи файлов в Интернете. Реализация этой функции в Java осуществляется с помощью класса FtpClient. Конкретный процесс реализации: сначала установить соединение с FTP-сервером; инициализировать метод передачи файлов, включая ASCII и BINARY; вывести файл в поток ввода файла FileInputStream; прочитать данные в FileInputStream в массив байтов; данные записываются в выходной поток TelnetOutputStream (используйте метод write для записи данных в сетевой канал). Таким образом, на сервер копируется файл с тем же именем, что и исходный файл. В этом примере JavaBean завершает процесс загрузки файла тремя методами: connectServer(), upload() и closeConnect(). Основная реализация выглядит следующим образом:
публичный класс ftpUpload
{ String filename;String filename1;FtpClient ftpClient;
public void ConnectServer (строковый сервер, строковый пользователь, строковый пароль, строковый путь)
{
//сервер: IP-адрес FTP-сервера. Пользователь: имя пользователя для входа на FTP-сервер;
//пароль: пароль имени пользователя для входа на FTP-сервер; путь: путь на FTP-сервере;
попробуйте {ftpClient = новый FtpClient ();
ftpClient.openServer(сервер);
ftpClient.login(пользователь, пароль);
System.out.println("Успешный вход!");
если (path.length()!=0) ftpClient.cd(путь);
ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
}
общественная недействительность closeConnect()
{попробуйте {ftpClient.closeServer();
}catch (IOException ex) {System.out.println(ex);}
}
публичная недействительная загрузка()
{ filename1 = findFileName (имя файла);
//Анализируем имя файла по имени файла и используем его в качестве имени целевого файла. Конкретный метод не указан.
пытаться {
TelnetOutputStream os=ftpClient.put(filename1);
java.io.File file_in = новый java.io.File (имя файла);
FileInputStream = новый FileInputStream (file_in);
байт[] байты=новый байт[1024];
интервал с;
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c });
есть.закрыть(); ОС.закрыть();
} catch (IOException ex) {System.out.println(ex);}
}
}
ConnectServer() завершает функцию установления соединения с FTP-сервером, использует метод openServer(string server) FtpClient для открытия удаленного FTP-сервера, а затем использует метод входа в систему (пользователь, пароль) FtpClient для входа на сервер. Существует два способа входа на удаленный FTP-сервер: один — войти как зарегистрированный пользователь, а другой — анонимный вход. В первом случае пользователю необходимо сначала зарегистрироваться в качестве клиента сервера. Сервер предоставит пользователю учетную запись и пароль и подключится к серверу на основе учетной записи и пароля. Последний требует, чтобы пользователи использовали специальные имена пользователей «annoymous» и «guest» без регистрации, чтобы ограничить доступ к общедоступным файлам на удаленных хостах. Многие системы теперь требуют, чтобы пользователи использовали свой адрес электронной почты в качестве пароля. В целях безопасности большинство анонимных FTP-хостов обычно позволяют удаленным пользователям загружать файлы, но не загружать их. Это зависит от настроек FTP-сервера. Пользователи могут использовать два метода в зависимости от реальных условий. После входа в систему используйте методbinary() FtpClient, чтобы инициализировать режим передачи в байтовый режим. upload() завершает функцию загрузки файла. Создайте входной поток файла FileInputStream исходного файла, запишите входной поток в массив байтов и используйте метод записи TelnetOutputStream для записи данных из массива байтов в сетевую ссылку. Поскольку TelnetOutputStream открывает файл на FTP-сервере, данные записываются в целевой файл, тем самым завершая загрузку файла. closeConnect() требует отключения от сервера.
Вышеупомянутый процесс загрузки одного файла. Если файлов несколько, этот процесс загрузки можно вызывать несколько раз. Из двух вышеупомянутых методов мы видим, что использование протокола FTP для загрузки нескольких файлов относительно просто и легко реализовать. Использование протокола FTP для загрузки файлов обычно представляет собой программу на стороне клиента, а настройки безопасности на стороне сервера будут более сложными, тогда как использование протокола HTTP для загрузки файлов — это приложение на стороне сервера, и настройки безопасности будут относительно простыми; . А в ходе тестирования выяснилось, что метод загрузки по FTP в десятки или даже сотни раз быстрее, чем метод загрузки по HTTP при передаче больших файлов, но немного медленнее, чем метод загрузки по HTTP при передаче файлов размером менее 1М. Таким образом, оба метода передачи имеют свои преимущества. Читателям рекомендуется действовать в соответствии со своими обстоятельствами. Если у вас есть какие-либо вопросы или вам нужен исходный код других частей, свяжитесь со мной!