Загрузка файлов очень распространена в веб -приложениях. Очень легко реализовать функцию загрузки файлов в среде JSP, потому что в Java в Java разработано много компонентов загрузки файлов. Эта статья принимает компонент Commons-FileUpload в качестве примера для добавления функции загрузки файлов в приложения JSP.
Компонент Common-FileUpload является одним из проектов с открытым исходным кодом Apache и может быть загружен с http://jakarta.apache.org/commons/fileupload/.
Этот компонент позволяет загружать один или несколько файлов за раз и может ограничить размер файла.
После загрузки рассеивайте пакет ZIP и копируйте Commons-FileUpload-1.0.jar для веб-приложений Tomcat под вашим WebAppweb-inflib. Если каталог не существует, пожалуйста, создайте свой собственный каталог.
Создайте новый сервлет: upload.java для загрузки файлов:
импортировать java.io.*; Импорт java.util.*; Импорт javax.servlet.*; Импорт javax.servlet.http.*; Импорт org.apache.commons.fileupload.*; Общедоступная загрузка класса расширяет httpservlet {private string uploadpath = "c: upload"; // каталог для загрузки файлов private String temppath = "c: uploadtmp"; // Временный каталог файлов public void dopost (httpservletrequest, httpservletresponse response) Throws IoException, ServletException {}}В методе DoPost (), когда сервтр получает запрос POST, выданный браузером, он реализует загрузку файлов. Вот пример кода:
public void Dopost (httpservlectrequest, httpservletresponse response) бросает ioexception, Servletexception {try {diskfileupload fu = new DiskfileUpload (); // Установить максимальный размер файла, вот 4MBFU.Setsizemax (4194304); // Установить размер буфера, вот 4KBFU.SetSizeThroshold (4096); // Установить временный каталог: fu.setRepositoryPath (Temppath); // Получить все файлы: list fileitems = fu.parserequest (request); Итератор i = fileitems.iterator (); // обрабатывать каждый файл в последовательности: while (i.hasnext ()) {fileitem fi = (fileitem) i.next (); // Получить имя файла, имя файла включает в себя path: string fileName = fi.getName (); // Здесь вы можете записать информацию о пользователе и файле // ... // Записать в файл, предварительное имя файла - A.Txt, и имя файла можно извлечь из имени файла: fi.write (новый файл (uploadpath + "a.txt")); }} catch (Exception e) {// Вы можете перейти на страницу ошибки}}Если вы хотите прочитать указанную папку для загрузки в файле конфигурации, вы можете выполнить ее в методе init ():
public void init () Throws ServletException {uploadPath = .... Temppath = .... // Если папка не существует, она будет автоматически создана: if (! new File (uploadPath) .isDirectory ()) новый файл (uploadpath) .mkdirs (); if (! new File (temppath) .isdirectory ()) новый файл (temppath) .mkdirs (); }Скомпилируйте сервлет, будьте осторожны, чтобы указать The Classpath, обязательно включите Commons-Upload-1.0.jar и Tomcatcommonlibservlet-api.jar.
Настройте сервис, используйте блокнот, чтобы открыть Tomcatwebapps для вашего webappweb-infweb.xml, и создайте новый, если нет.
Типичные конфигурации следующие:
Да? 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> ϩ web-app> ъем Сервлета> ϩ Servlet-name> Загрузить em/servlet-name> ϩ-class> загрузка ема/с ERVLET-CLASS> MAPPING SERVLET сотрудник Сервлета> Загрузка ϩ/Servlet-name> ϩ URL-PATTERN}/fileUpload em/url-pattern em/servlet-карта
После настройки сервлета запустите Tomcat и напишите простой тест HTML:
Form action = "fileupload" method = "post" ectype = "Multipart/Form-Data" name = "form1"> in input type = "file" name = "file"> vint Type = "Отправить" name = "Value" value = "upload"> ъем/form> form>
Примечание action = "fileupload", где FileUpload-это URL-паттерн, указанный при настройке сервлета.
Вот код для креветки:
Эта загрузка намного проще в использовании, чем Smartupload. Он был полностью создан мной байтами один за другим, в отличие от Smartupload, который имеет много ошибок.
Метод вызова:
Загрузить = new upload (); up.init (запрос); /** может вызовать setsavedir (string savedir); Установите путь сохранения и вызовы SetMaxFilesize (длинный размер), чтобы установить максимальный байт загруженного файла. Вызовите SettAgFilename (String), чтобы установить имя файла после загрузки (только для первого файла)*/up. uploadfile ();
Затем string [] names = up.getFilename (); Получите загруженное имя файла, абсолютный путь файла должен быть
Сохраняемый каталог savedir+"/"+имена [i];
Вы можете получить загруженный текст или up.getParametervalues («подано») через up.getParameter («Поле»);
Получите значения полей с одинаковым именем, таким как несколько флажков.
Попробуйте другие сами.
Исходный код заключается в следующем: __________________________________________________________________________
пакет com.inmsg.beans; импортировать java.io.*; Импорт java.util.*; Импорт javax.servlet.*; Импорт javax.servlet.http.*; public class upload {private string savedir = "."; // Путь к сохранению файла частной строки contentype = ""; // Тип документа Private String charset = ""; // набор символов Private ArrayList tmpfilename = new ArrayList (); // Временная структура данных для хранения имен файлов Private Hashtable Parameter = new Hashtable (); // Структура данных, которая хранит имена и значения параметров частного контекста ServletContext; // Программный контекст, используемый для инициализации частного запроса HttpservletRequest; // экземпляр, используемый для передачи в объекте запроса частной строки Bounder = ""; // Разделитель данных памяти Private int len = 0; // Длина байта на самом деле читается с внутреннего каждый раз, когда частная строковая QueryString; частный int count; // Общее количество загруженных файлов частная строка [] filename; // загруженная имени файла массив Private Long MaxFilesize = 1024 * 1024 * 10; // максимальная загрузка файлов байты; Приватная строка tagfilename = ""; public final void init (httpservletRequest) Throws ServletException {this.Request = запрос; Brandary = request.getContentType (). substring (30); // Получить введенный в память Data DeNimiter QueryString = request.getQueryString (); } public String getParameter (String s) {// используется для получения значения параметра указанного поля, revide request.getParameter (String s) if (parameter.isempty ()) {return null; } return (string) parameter.get (s); } public String [] getParametRovalues (String S) {// используется для получения массива параметров, указанного с тем же полем имени, переопределение request.getParametervalues (строки s) ArrayList al = new ArrayList (); if (parameter.isempty ()) {return null; } Перечисление e = parameter.keys (); while (e.hasmoreElements ()) {string key = (string) e.nextelement (); if (-1! = key.indexof (s + "|||||||||") || key.equals (s)) {al.add (parameter.get (key)); }} if (al.size () == 0) {return null; } String [] value = new String [al.size ()]; for (int i = 0; i ϩ value.length; i ++) {value [i] = (String) al.get (i); } return value; } public String getQueryString () {return QueryString; } public int getCount () {return count; } public String [] getFilEname () {return filename; } public void setMaxFilesize (длинный размер) {maxFilesize = size; } public void setAgFilEname (String FileName) {TagfilEname = filename; } public void setSavedir (String saveDir) {// Установите путь для сохранения для загрузки файла this.savedir = savedir; File testdir = new File (saveDir); // Чтобы гарантировать, что каталог существует, если нет, создайте каталог if (! Testdir.exists ()) {testdir.mkdir (); }} public void setCharset (String charset) {// Установить символ SET this.charset = charset; } public boolean uploadfile () Throws ServletException, ioException {// Метод загрузки, вызванный пользователем setChess (request.getCaracterencoding ()); return uploadfile (request.getInputStream ()); } private boolean uploadfile (servletinputstream servletinptstream) бросает // основной метод для получения центрального хранилища данных ServletException, ioException {String line = null; Byte [] buffer = новый байт [256]; while ((line = readline (buffer, servletinputstream, charset))! = null) {if (line.startswith ("content-disposition: form-data;"))) {int i = line.indexof ("filename ="); if (i us = 0) {// Если есть имя файла = в описании в разделителе, это означает, что это кодируемое содержимое строки файла fname = getFilename (line); if (fname.equals ("" ")) {продолжить; } if (count == 0 && tagfilename.length ()! = 0) {string ext = fname.substring ((fname.lastindexof (".") + 1)); fname = tagfilename + "." + ext; } tmpfilename.add (fname); count ++; while ((line = readline (buffer, servletinputstream, charset))! = null) {if (line.length () ϩ = 2) {break; }} Файл f = новый файл (savedir, fname); FileOutputStream dos = new FileOutputStream (f); длинный размер = 0l; while ((line = readline (buffer, servletinputstream, null))! = null) {if (line.indexof (граница)! = -1) {break; } size += len; if (size} maxfilesize) {бросить новое ioexception ("файл превышает" + maxfilesize + "byte!"); } dos.Write (буфер, 0, Лен); } dos.close (); } else {// в противном случае это содержание поля кодирования строки key = getKey (line); String value = ""; while ((line = readline (buffer, servletinputstream, charset))! = null) {if (line.length () ϩ = 2) {break; }} while (((line = readline (buffer, servletinputstream, charset))! = null) {if (line.indexof (граница)! = -1) {break; } value += line; } put (key, value.trim (), parameter); }}} if (queryString! = null) {string [] chany = split (QueryString, "&"); for (int k = 0; k ϩ chany.length; k ++) {string [] nv = split (каждый [k], "="); if (nv.length == 2) {put (nv [0], nv [1], parameter); }}} filename = new String [tmpfilename.size ()]; for (int k = 0; k ϩ filename.length; k ++) {filename [k] = (String) tmpfilename.get (k); // Залить временное имя файла в ArrayList в данные, чтобы пользователь вызовал} if (filename.length == 0) {return false; // Если данные имени файла пусты, это означает, что файл не загружен} вернуть true; } private void put (String Key, String Value, Hashtable ht) {if (! ht.containskey (key)) {ht.put (key, value); } else {// Если у вас уже есть ключ с тем же именем, вы должны переименовать текущий ключ. В то же время будьте осторожны, чтобы не сформировать то же имя, что и ключ Try {thread.currentThread (). Sleep (1); // Чтобы не генерировать два идентичных клавиша в одном и том же MS} Catch (Exception e) {} Key += "||||||||||| + System.currentTimeMiLlis (); ht.put (ключ, значение); }}/* Вызов ServletInputStream.Readline (Byte [] B, Int смещение, длина), который считывает линию из потока ServletInputStream к указанному байтовому массиву. Чтобы убедиться, что она может вместить линию, байт [] B не должен составлять менее 256. В переписываемой линии чтения переменная члена вызывается к фактическому количеству чтения байтов (некоторые строки менее 256). При написании содержимого файла байт длины лена должен быть записан из байтового массива вместо всей длины байта []. Тем не менее, переписанный метод возвращает строку для анализа фактического содержания и не может вернуть Лен, поэтому Лен устанавливается в качестве переменной -члена и назначает ему фактическую длину каждый раз, когда операция чтения. То есть при обработке содержимого файла данные должны быть возвращены в форме строки для анализа начальных и конечных знаков, а также записаны в выходной поток файла в форме байта [] одновременно. */private String Readline (byte [] linebyte, ServletinputStream servletinputStream, String charset) {try {len = servletinputstream.readline (linebyte, 0, linebyte.length); if (len == -1) {return null; } if (charset == null) {return new String (linebyte, 0, len); } else {return new String (linebyte, 0, len, charset); }} catch (Exception _ex) {return null; }} частная строка getFilename (строка строки) {// отделить имя файла от строки описания if (line == null) {return ""; } int i = line.indexof ("filename ="); line = line.substring (i + 9) .trim (); i = line.lastindexof ("" "); if (i ϩ 0 || i us = line.length () - 1) {i = line.lastIndexof ("/"); if (line.equals ("" "" ")) {return" "; } if (i ϩ 0 || i us = line.length () - 1) {return line; }} return line.substring (i + 1, line.length () - 1); } частная строка getKey (строка строки) {// отделить имя поля от строки описания if (line == null) {return ""; } int i = line.indexof ("name ="); line = line.substring (i + 5) .trim (); return Line.substring (1, line.length () - 1); } public static String [] split (string strob, string mark) {if (strob == null) {return null; } StringTokenizer st = new StringTokenizer (Strob, Mark); ArrayList tmp = new ArrayList (); while (st.hasmoretokens ()) {tmp.add (st.nexttoken ()); } String [] strarr = new String [tmp.size ()]; for (int i = 0; i ϩ tmp.size (); i ++) {strarr [i] = (string) tmp.get (i); } вернуть Strarr; }} Скачать на самом деле очень проста. Пока вы обрабатываете его следующим образом, никаких проблем не возникнет. Public void Download (String filePath, httpservletresponse response, boolean isonline) бросает исключение {file f = new File (filePath); if (! f.exists ()) {response.senderror (404, «Файл не найден!»); возвращаться; } BufferedInputStream br = new BufferedInputStream (New FileInputStream (F)); byte [] buf = new Byte [1024]; int len = 0; response.reset (); // это очень важно, если (isonline) {// ononopen метод URL U = новый URL ("file: ///"+filePath); response.setContentType (u.Openconcenection (). getContentType ()); response.setheader ("Содержимое-распада", "inline; filename ="+f.getName ()); // Имя файла должно быть кодируется как UTF-8} else {// pure метод загрузки response.setContentType ("Application/x-msdownload"); response.setheader ("Distosition", "Attactment; filename =" + f.getName ()); } OutputStream out = response.getOutputStream (); while ((len = br.read (buf)) ás 0) out.write (buf, 0, len); br.close (); out.close (); }