Загрузка и загрузка файлов очень распространена во время разработки. Вот краткое изложение:
1. Условия, которые должны быть выполнены для загрузки файлов:
а Метод формы страницы должен быть опубликовано, потому что данные, передаваемые GET, слишком мал
беременный Enctype формы страницы должен быть из типа Multipart/Form Data
в Форма содержит подробную информацию о загрузке кода поля ввода: в форме клиента: <form enctype = "Multipart/Form-Data"/>
(Если это свойство недоступно, путь к файлу, считываемый сервером, будет варьироваться в зависимости от браузера)
Server ServletInputStream IS = request.getInputStream (); Получает содержание корпуса запроса в потоке для дальнейшего анализа.
2. Подробная информация о загрузке файлов:
(1) Зачем установить тип формы на: Multipart/Form-Data. Это должно установить значение, передаваемое этой формой, которая не является ключом = значение. То, что прошло, это байт -код.
Переписка между формой и запросом:
Как показано выше, вы можете видеть, что после настройки типа формы на: Multipart/Form-Data выбранная вами файл инициализируется в двоичный файл в корпусе HTTP-запроса, как показано на рисунке выше под случайной строкой под файлом cookie.
Но обратите внимание, что в байт -коде файла есть две особые строки символов, разделенные на идентификационный файл (то есть строка случайных строк), а именно первая строка заголовка файла содержимого и строку пустых строк. Третья строка после этого - бинарный файл.
Поэтому, когда сервер принимает файлы, загружаемые клиентом, при получении двоичного файла в параметрах HTTP -запроса, первые три строки должны быть удалены.
3.
Импорт java.io.bufferedReader; импорт java.io.ioexception; import java.io.inputStream; импорт java.io.inputStreamReader; импорт java.io.printwriter; импорт javax.servlet.servletexcept javax.servlet.http.httpservlectrequest; import javax.servlet.http.httpservletresponse;/** * Если тип формы-это post, а ectype-многоуровневая/дата формы *, тогда все данные передаются на сервер в бинарном режиме. * Итак, req.getParameter ("xxx") всегда нулю. * Вы можете получить данные только через req.getInputStream () и получить данные текста * * @author wangxi * */public class upservlet extends httpservlet {public void dopost (httpservletrequest req, httpservletresponse response) throwsception, ioexception {req.setchar-8; String txt = req.getParameter ("txt"); // return is null System.err.println ("txt is:"+txt); System.err.println ("======================================================================= InputStream in = req.getInputStream (); // byte [] b = new Byte [1024]; // int len = 0; // while ((len = in.read (b))! =-1) {// string s = new String (b, 0, len); // system.errint (s); //} BufferdeReader bufferer bufferedeamer (S); String firstline = br.readline (); // Читать первую строку, а первая строка - это символ разграниченного количества, то есть случайная строка строкового файла = br.readline (); // Вторая строка информации файла и перехватить имя файла из IT FILENAME = FILENAME.SUBSTRING (FILENAME.LASTINDEXOF ("//) 1);//xxX filename.substring (0, filename.length ()-1); while (data = br.readline ())! 4. Используйте Apache-FileUpload для обработки загрузки файлов:
Структура: относится к инкапсулированию бизнеса, который пользователи часто обрабатывают в коде. Облегчить пользователям звонить.
(Frame) компонент, который в настоящее время загружает файл:
Apache-Fileupload-
Orialiy cos 2008 () -
JSP-Smart-Upload 200m.
Загрузите файл с помощью FileUpload:
Требуется импорт сторонних пакетов:
Apache-fileupload.jar файл загружает основной пакет.
Apache-Commons-IO.jar Этот пакет является пакетом зависимостей для FileUpload. Это также инструментарий.
Основная категория:
DiskFileItemFactory устанавливает дисковое пространство и сохраняет временные файлы. Просто класс.
ServletFileUpload - класс Core для загрузки файлов, который получает запросы и анализы Requust.
ServletFileUpload.parseRequest (requesdest) - List <FieleItem>
Note: A FileItem is the beginning of a logo: --------243243242342 To -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Шаг 1: импортировать пакет:
Шаг 2: Напишите сервлет, чтобы завершить метод DoPost
/*** Два параметра, построенные DiskFileItemFactory* Первый параметр: SizetReadhold - устанавливает, сколько байтов данных для сохранения в кэше (память) по умолчанию составляет 10K* Если файл не превышает 10 тыс., Вы можете просто использовать память, чтобы сохранить его непосредственно в файл. * Если файл превышает 10K, вам нужно сначала сохранить файл во временный каталог. * Второй файл параметров относится к месту временного каталога * */public class up2servlet extends httpservlet {public void dopost (httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {req.setcharacterencing ("utf -8"); // Получить путь проекта String Path = getServletContext (). GetRealPath ("/up"); // Первый шаг объявляет класс DiskFileItemFactory Factory, который используется для установки временного каталога на диск, DiskFileItemFactory Disk = новый DiskFileTemFactory (1024*10, новый файл ("/home/wang/")); // Второй шаг: объявить ServletFileUpoLoad и получить вышеуказанный временный каталог ServletFileUpload up = new ServletFileUpload (диск); // Третий шаг: запрос Parse try {list <fieleTem> list = up.parserequest (req); // если только один файл файла файла = list.get (0); // Получить имя файла с помощью path String fileName = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); // Получить тип файла string fileType = file.getContentType (); // Получить файл bytecode inputstream in = file.getInputStream (); // Объявит выходной байт потока outputStream Out = new FileOutputStream (path+"/"+filename); // файл копировать byte [] b = новый байт [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); Long Size = file.getInputStream (). Доступен (); // Удалить загруженный временный файл файла.delete (); // показать данные resp.setContentType ("text/html; charset = utf-8"); Printwriter op = resp.getwriter (); Op.print ("Файл Загружен успешно <br/> Имя файла:"+filename); op.print ("<br/> Тип файла:"+filetype); op.print ("<br/> размер файла (байты)"+size); } catch (Exception e) {e.printstackTrace (); }}}5. Используйте эту структуру для загрузки нескольких файлов:
Шаг 1: Измените форму страницы на несколько типов вводов = "файл"
<form action = "<C: url value = '/up3servlet' //>" method = "post" ectype = "multipart/form-data"> file1: <input type = "file" name = "txt"> <br/> file2: <input type = "file" name = "txt"> <br/> <input = "file"/> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </>
Шаг 2: Список траверсов
Public Class UP3Servlet расширяет httpservlet {public void dopost (httpservletrequest, httpservletresponse response) Throws servletexception, ioException {request.setcharacterencoding ("utf-8"); String path = getServletContext (). GetRealPath ("/up"); // объявить диск diskfileitemfactory disk = new DiskFileItemFactory (); Disk.SetSizeTherShold (1024*1024); disk.setrepository (новый файл ("d:/a")); // Объявит сервлет, который анализирует запрос servletfileupload up = new ServletFileUpload (диск); try {// spearch Question List <fieTem> list = up.parserequest (request); // Объявит список <Ap> инкапсулировать данные загруженного списка файлов <map <string, string >> ups = new ArrayList <map <string, string >> (); for (fileitem file: list) {map <string, string> mm = new hashmap <string, string> (); // Получить имя файла string fileName = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); String fileType = file.getContentType (); InputStream in = file.getInputStream (); int size = in.vailable (); // Использование инструмента класса fileutils.copyInputStreamToFile (in, новый файл (path+"/"+filename)); mm.put («имя файла», имя файла); mm.put ("filetype", filetype); mm.put ("size", "+size); ups.add (mm); file.delete ();} request.setattributВыше приведено общий метод загрузки файлов. Теперь давайте посмотрим на другие поисковые API -интерфейсы FileUpload.
Определите, является ли FileItem объектом файла (type = file) или текстом (type = text | флажок | Радио) объект:
Boolean isformfield () Если это текст | Флажок | Радио | Выберите, значение верно.
6. Обработка изображений с информацией о описании
открытый класс UpdescServlet расширяет httpservlet {public void dopost (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {request.setcharacterencoding ("utf-8"); // Вы можете получить китайский файл string path = geterVletContext ("). DiskFileItemFactory Disk = новый DiskFileItemFactory (); disk.setrepository (новый файл ("d:/a")); try {servletfileUpload up = new ServletFileUpload (диск); List <fieTiTem> list = up.parserequest (request); Для (FileItem File: List) {// Шаг 1: Определите, является ли это обычным элементом формы if (file.isformfield ()) {string filename = file.getfieldname (); // <input type = "text" name = "desc"> = desc String value = file.getString ("utf-8"); // by deflaint, чтение данных в iso, system.err. } else {// указывает, что это файловая строка fileName = file.getName (); filename = filename.substring (filename.lastindexof ("//")+1); file.write (новый файл (path+"/"+filename)); System.err.println ("Имя файла:"+fileName); System.err.println ("Размер файла is:"+file.getSize ()); file.delete (); }}} catch (Exception e) {e.printstackTrace (); }}} 7. Улучшенная производительность загрузки файлов
При анализе запроса для получения коллекции FileItem используйте:
FileItemiterator it = up.getIteMiterator (запрос);
По сравнению с использованием
List <fieTiTem> list = up.parserequest (request);
Гораздо лучшая производительность.
Пример кода:
Public Class FastServlet расширяет httpservlet {public void dopost (httpservletrequest-запрос, httpservletresponse response) Throws servletexception, ioexception {request.setcharacterencoding ("utf-8"); String path = getServletContext (). GetRealPath ("/up"); DiskFileItemFactory Disk = новый DiskFileItemFactory (); disk.setrepository (новый файл ("d:/a")); try {servletfileUpload up = new ServletFileUpload (диск); // Ниже приведено режим итератора FileItemiterator it = up.getIteMiterator (запрос); while (it.hasnext ()) {fileitemstream item = it.next (); String fileName = item.getName (); filename = filename.substring (filename.lastindexof ("//")+1); InputStream in = item.openstream (); Fileutils.copyinputstreamtofile (in, новый файл (path+"/"+filename)); }} catch (Exception e) {e.printstackTrace (); }}} 8. Скачать файл
Это может быть либо получить, либо пост.
public void Dopost (httpservletrequest req, httpservletresponse resp) бросает Servletexception, ioException {req.setcharacterencoding ("utf-8"); String name = req.getParameter ("name"); // Шаг 1: Установите тип ответа. // Второе чтение файла PATH = getServletContext (). GetRealPath ("/up/"+name); InputStream in = new FileInputStream (path); // Установить заголовок ответа // usert url кодирование имени файла имя = urlencoder.encode (name, "utf-8"); Resp.setheader («Содержание», «Приложение»; файл имени = "+name); Resp.SetContentLength (in.vailable ()); // Шаг 3: Запустите файл Copy outputStream out = resp.getOutputStream (); байт [] b = новый байт [1024]; int len = 0; while ((len = in.read (b))! =-1) {out.write (b, 0, len); } out.close (); in.close (); } При использовании Popular Framework J2EEЛегче использовать внутреннюю инкапсуляцию фреймворка для завершения загрузки и загрузки:
Struts2 загружается.
При использовании Struts2 для разработки нетрудно обнаружить, что пакет Commons-FileUpload-1.3.1.jar присутствует в пакете импортированных JAR. Через приведенное выше обучение мы уже можем использовать его для загрузки и загрузки файлов. Но Struts2 подвергается дальнейшей инкапсуляции.
вид
<form action = "fileupload.action" method = "post" ectype = "multipart/form-data"> username: <input type = "text" name = "username"> <br> файл: <input type = "file" name = "file"> <br> <input type = "Отправить" value = "prope"> </form> name = "
Контроллер
открытый класс FileUploadAction расширяет ActionSupport {private String username; // Обратите внимание, что файл не ссылается на сам файл, загруженный фронтальным JSP, а файл, загруженный для хранения файла отдельного файла под во временной папке; // Имя представленного файла // Спорты автоматически перехватывают имя последнего файла и внедрят его в это свойство частное строковое файл filefilename; // getter и setter сохраняются в настоящее время для сохранения пространства @Override public String execute () Throws Exception {// Сохранить путь к загруженному файловому строку root = servletactionContext.getServletContext (). GetRealPath ("/upload"); // Получить временный поток ввода файла inputstream is = new FileInputStream (file); // выходной файл outputStream OS = new FileOutputStream (новый файл (root, fileFilename)); // Распечатать имя файла загруженной файловой системы. // Поскольку файл является файлом, хранящимся во временной папке, мы можем распечатать его имя файла и путь к файлу, чтобы увидеть, такой же, как и предыдущий FileFilename System.out.println ("file:" + file.getName ()); System.out.println ("file:" + file.getPath ()); Byte [] buffer = новый байт [1024]; int length = 0; while (-1! = (length = is.read (buffer, 0, buffer.length))) {os.write (buffer); } os.close (); is.close (); вернуть успех; }}Прежде всего, мы должны прояснить, что файл здесь на самом деле не ссылается на файл, загруженный JSP. Когда файл загружен, Struts2 сначала будет искать местоположение хранилища, указанное struts.multipart.savedir (это по умолчанию.properties) (по умолчанию пусто). Мы можем указать это временное место хранения в Struts2 нашего проекта.
<constant name = "struts.multipart.savedir" value = "/Repository"/>
Если struts.multipart.savedir не установлен, адрес, указанный Javax.servlet.context.tempdir, будет использоваться по умолчанию. Значение javax.servlet.context.tempdir определяется сервером. Например: если контекст моего веб -проекта является ABC, а сервер использует Tomcat, то SavePath должен быть %tomcat_home %/work/catalina/localhost/abc_. Имя временного файла аналогично upload__1a156008_1373a8615dd__8000_00000001.tmp. Временное имя файла может быть различным каждый раз, но оно примерно в этом стиле. И если вы используете серверы в Eclipse для настройки Tomcat и запуска, то % tomcat_home % в вышеуказанном адресе не будет фактическим каталогом Tomcat Root в системе, а будет адрес, указанный Eclipse. Например, мой локальный адрес заключается в следующем: /HOME/WANG/ECLIPSEJAVACODE/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload__1a156008_1373a861515dd__clealed__1.156008_1373a8615151000_00001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.0001.
Struts2 закончен загрузка.
Загрузите файл Struts2 более проще, просто определите поток ввода и напишите файл в поток ввода. Конфигурация ключа по -прежнему заключается в том, чтобы настроить его в файле конфигурации struts.xml:
открытый класс FileDownLoadAction расширяет ActionSupport {// Путь для загрузки файла на сервере Private String Path; // Имя файла файла для скачивания частной строки загрузки filename; // Написать Getter и Setter public inputStream getDownloadFile () {return servletactOncecontext.getServletContext (). GetResourCeasStream (path); } @Override public String execute () throws exception {// Текущее действие - sTowdWOADFILENAME (xxx); вернуть успех; }}Действие просто определяет входную потоку загрузки, а затем предоставляет его методом Getter. Далее, давайте посмотрим на файл конфигурации struts.xml:
<name Action = "filedownload"> <name name = "type" type = "stream"> <param name = "contentDisposition"> Attachment; filename = "$ {downloadfilename}" </param> <param name = "input -amame"> downloadfile </param> </result> </action> <param name = "inpute"> downloadfile </param> </result> </action> </action> </action> </action> </action> <param name = "> downloadfile </param> </result> </action>Есть несколько мест, где нам нужно обратить внимание на файл конфигурации struts.xml. Во -первых, тип должен быть определен как Stream Type_, сообщающий действие, что это результат загрузки файла. Элемент результата обычно имеет подразделение PARAM. Это используется для установки параметров при загрузке файла. Атрибут inputName состоит в том, чтобы получить поток ввода файла в действии. Имя должно быть таким же, как атрибут ввода потока в действии. Затем атрибут ContentDisposion. Этот атрибут обычно используется для указания того, как мы хотим обработать загруженный файл. Если значение является вложением, появится ящик для загрузки, позволяя пользователю выбирать, загружать ли загрузку. Если это значение не установлено, браузер сначала проверит, следует ли открывать загруженный файл. Если это возможно, он напрямую откроет загруженный файл (конечно, это не то, что нам нужно). Другим значением является имя файла, которое является именем загрузки файла, подписанным файлом при загрузке. После настройки этой информации мы можем реализовать функцию загрузки файла.
Springmvc завершает загрузку:
Вид точно такой же, как пример Struts2. Это не написано.
Контроллер:
@Controller@requestmapping (value = "fileoperate") public class fileoperateaction {@requestmapping (value = "upload") public string upload (httpservlectrequest,@requestparam ("file") multipartfile photofile) {// Путь к загрузке файл save string = requestsession.getsession (). // исходное имя файла string fileName = photofile.getoriginalfilename (); // Получить строку расширения файла extname = filename.substring (filename.lastindexof (".")); // Предотвращение конфликтов имени файла, слегка измените имя fileName = filename.substring (0, filename.lastIndexof ("."))) + System.nanotime () + extname; Fileutils.writebytearraytofile (новый файл (dir, filename), photofile.getbytes ()); вернуть "успех"; }}SpringMVC Complete Download:
@RequestMapping ("/скачать") public String Download (String fileName, httpservlectrequest, httpservletresponse response) {response.setcharacterencoding ("utf-8"); response.setContentType ("Multipart/Form-Data"); response.setheader ("Содержимое-распада", "Приложение; filename =" + filename); try {inputStream inputStream = new FileInputStream (новый файл (путь файла); outputStream OS = response.getOutputStream (); byte [] b = new Byte [2048]; int length; while ((длина = inputStream.read (b))> 0) {os.write (b, 0, длина); } catch (filenotfoundexception e) {e.printstacktrace ();Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.