LINUX.ORG.RU

jsp multiple file upload


0

1

Здравствуйте!
Начал изучать java и jsp, возникла такая задача: есть форма с несколькими text-field'ами и кнопкой submit. Введенные данные определенным образом обрабатываются. Добавляю несколько input'ов типа file для загрузки нескольких файлов. Как реализовать загрузку выбранных файлов? Что нужно добавить в обработчик формы?
Гуглил, нашел только какие-то старые примеры (2001-2005 годов), ни один из них не заработал.
Заранее спасибо!

★★★★★

на пыхе и на rails делал, было в общем-то не сложно.
Найденные примеры на jsp какие-то слишком мудреные, как-то все с костылями делается. Думал, может как-нибудь проще можно.

Про Викет первый раз слышу, спасибо, сейчас гляну!

kovrik ★★★★★
() автор топика
Ответ на: комментарий от JFreeM

Проблема в том, что нужно сделать не отдельную форму для загрузки файлов, а добавить возможность загрузки к уже существующей форме, и чтобы обработчик, помимо остальных данных, обрабатывал бы и загруженные файлы. А то, что уже есть - реализовано на jsp.

kovrik ★★★★★
() автор топика

В общем сделал загрузку файлов, только теперь столкнулся с такой проблемой: для загрузки файлов в форме нужно добавить enctype=«multipart/form-data». Тогда файлы загружаются, но остальные части формы (чекбоксы, text-field'ы и др.) перестают обрабатываться.
Если убрать enctype, то, наоборот.
Как решить проблему?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

Я так понимаю, что теперь это не обычный POST-запрос, т.к. теперь используется MIME. Поэтому получать остальные значения (чекбоксов, text-field'ов) уже надо по-другому, или нет? Если да, то как?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от ef37

>Используй jakarta-commons-fileupload
Да, его я и использую. В общем-то файлы заливает, теперь осталось остальные данные multipart request'ом получить..ю

kovrik ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

>А почему бы их просто xmlhttprequest'ом не отсылать отдельно?
Ммм..а можно подробнее? Пример какой-нибудь?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

Например, так:

function make_directory(){
        var curdir = $('filename').name;
        var nd = $('newdir').value;
        var newdir = hexdump(nd);
        var timeout;
        if(!newdir){
                __alert("Введите имя директории");
                return;
        }
        function ini(){};
        function ok(){
                var newFrm = request.responseText;
                var iframe_ = window.dummyframe.document;
                iframe_.open();
                iframe_.write(newFrm);
                iframe_.close();
                get_content();
        };
        sendrequest("https://server.domain/cgi-bin/mkdir", 'DIR='+curdir+';NEWDIR='+newdir, ini, ok);
        chdirstat();
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kovrik

Ты бы сходил по ссылке, которую я давал:

// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();

    if (item.isFormField()) {
        processFormField(item);
    } else {
        processUploadedFile(item);
    }
}
Для обычных полей формы:
// Process a regular form field
if (item.isFormField()) {
    String name = item.getFieldName();
    String value = item.getString();
    ...
}

ef37 ★★
()
Ответ на: комментарий от ef37

А стоит ли для простой задачи подключать тяжелючую библиотеку, да еще и с серверной частью на яве? Можно же намного проще обойтись, собственными силами, так сказать...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А стоит ли для простой задачи подключать тяжелючую библиотеку, да еще и с серверной частью на яве?

Она у него изначально была подключена, как я понял ;-) Речь про всю теже commons-fileupload :-) Да и не настолько она тяжелая.

ef37 ★★
()
Ответ на: комментарий от ef37

Да и не настолько она тяжелая.

Не сказал бы, судя по количеству файлов в их SVN. А ведь можно все организовать значительно меньшим количеством кода (как клиентского, так и серверного). Хотя, конечно, если пользоваться всеми «плюшками» этой библиотечки, то велосипед изобретать не стоит.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ну утешай себя дальше. Мы уже тулзы 3 переписали с Си и С++ на Java.

dizza ★★★★★
()

Раньше был определенный код, обрабатывающий форму. Потом добавил код, для обработки файлов:

File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;

String filePath = "/home/kovrik/Downloads/";

// Verify the content type
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0))
{
	DiskFileItemFactory factory = new DiskFileItemFactory();
	// maximum size that will be stored in memory
	factory.setSizeThreshold(maxMemSize);
	// Location to save data that is larger than maxMemSize.
	factory.setRepository(new File("/home/kovrik/temp/"));
	
	// Create a new file upload handler
	ServletFileUpload upload = new ServletFileUpload(factory);
	// maximum file size to be uploaded.
	upload.setSizeMax( maxFileSize );
	try
	{
		// Parse the request to get file items.
		List fileItems = upload.parseRequest(request);
		
		// Process the uploaded file items
		Iterator i = fileItems.iterator();
		
		while ( i.hasNext () )
		{
			FileItem fi = (FileItem)i.next();
			if ( ! fi.isFormField () )
			{
				// Get the uploaded file parameters
				String fieldName = fi.getFieldName();
				String fileName = fi.getName();
				boolean isInMemory = fi.isInMemory();
				long sizeInBytes = fi.getSize();
				// Write the file
				if( fileName.lastIndexOf("\\") >= 0 )
				{
					file = new File( filePath +
					fileName.substring( fileName.lastIndexOf("\\"))) ;
				}
				else
				{
					file = new File( filePath +
					fileName.substring(fileName.lastIndexOf("\\")+1)) ;
				}
				fi.write( file ) ;
			}
			
			//------------------------------------------
			else
			{
				if ( fi.isFormField() )
				{
				                                                            
				}

			}
			// -----------------------------------------
		}

	}
	catch(Exception ex)
	{
		System.out.println(ex);
	}
}  

Соответственно, код, который идет ниже, для обработки остальных полей формы теперь не работает. Я так понимаю, что остальные поля нужно обрабатывать в блоке if (fi.isFormField()){}, только как теперь получить значения этих полей? Или же оставить код для обработки других полей ниже, но что в нем тогда изменить надо, чтобы Он работал с multipart/form-data?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

В общем разобрался уже, и файлы копирует, и остальные поля обрабатывает (правда, еще одна теперь проблема, но уже другая =) ).

kovrik ★★★★★
() автор топика

Если вдруг кому понадобится, то проблему решил так:

Задача:
У нас есть форма, в которую нужно добавить возможность заливки файлов.

Решение:
1. В форме:

<form method="POST" 
      action="some_action.jsp"
      enctype="multipart/form-data">

где some_action.jsp - обработчик формы.

2. Качаем com.oreilly.servlet
3. Подключаем сервлет (в some_action.jsp):

 import com.oreilly.servlet.MultipartRequest; 

4. Далее, в обработчике формы (some_action.jsp):

// задаем путь, куда файлы будут копироваться
String temp_dir = "/home/kovrik/temp/";

// создаем MultipartRequest.
// аргументы: 
// request - это HttpServletRequest
// temp_dir - куда файлы копируем
// 5*1024*1024 - максимальный размер файла
// "UTF-8" - кодировка
// для переименования заливаемых файлов можно добавить в качестве аргумента new com.myservlets.MyFileRenamePolicy(), где MyFileRenamePolicy() - реализация интерфейса FileRenamePolicy, в котором и происходит переименование файлов (но с этим пока не очень разобрался =) )
MultipartRequest multi = new MultipartRequest(request, temp_dir, 5*1024*1024, "UTF-8"); 

Всё, при обработке формы все файлы зальются в temp_dir

Но, т.к. мы добавили enctype=«multipart/form-data» в форме, то остальные поля перестанут обрабатываться.
Допустим у нас было:

String name = request.getParameter("name");

Меняем request (HttpServletRequest) на multi (MultipartRequest):

String name = multi.getParameter("name");

Всё, теперь поле name будет обрабатываться как раньше. С остальными поступаем аналогично.

kovrik ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.