Данный пример иллюстрирует возможность загружать файлы на сервер с помощью HTML форм.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class UploadServlet extends HttpServlet
{
private static final String CONTENT_TYPE = "text/html; charset=windows-1251";
private static final int CR = (int)'\r';
private static final int LF = (int)'\n';
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
// HTML форма, отправляемая методом post
out.println("‹html›");
out.println("‹head›‹title›UploadServlet‹/title›‹/head›");
out.println("‹body›");
out.println("‹form action=\"UploadServlet\" method=\"post\"
enctype=\"multipart/form-data\"›");
out.println("‹input type=file name=ufile›");
out.println("‹input type=submit value=\"Attach\"›");
out.println("‹/form›");
out.println("‹/body›‹/html›");
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//Поток, в который будет писаться содержимое (в принципе может быть любой OutputStream)
FileOutputStream fos = new FileOutputStream("D:\\ufile");
int[] dataSlice = extractData(request);
int i;
for(i=0; i fos.write(dataSlice[i]);
fos.flush();
fos.close();
// HTML форма отправляемая методом post
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("‹html›");
out.println("‹head›‹title›UploadServlet‹/title›‹/head›");
out.println("‹body›");
out.println("‹form action=\"UploadServlet\" method=\"post\"
enctype=\"multipart/form-data\"›");
out.println("‹input type=file name=ufile›");
out.println("‹input type=submit value=\"Attach\"›");
out.println("‹/form›");
out.println("‹/body›‹/html›");
out.close();
}
private int[] extractData(HttpServletRequest request) throws IOException
{
// Содержимое пришедших байтов их запроса (содержимое приходящего файла)
InputStream is = request.getInputStream();
int[] data = new int[request.getContentLength()];
int bytes;
int counter = 0;
while((bytes=is.read())!=-1)
{
data[counter]=bytes;
counter++;
}
is.close();
// Определение индексов срезки
int i;
int beginSliceIndex = 0;
// Конечный индекс срезки - длина границы + доп. символы.
int endSliceIndex = data.length - getBoundary(request).length()-9;
for(i = 0; i < data.length; i++)
{
// Начальный индекс срезки: после того как встретятся 2 раза подряд \r\n
if(data[i] == CR && data[i+1] == LF && data[i+2] == CR && data[i+3] == LF)
{
beginSliceIndex = i+4;
break;
}
}
int[] dataSlice = new int[endSliceIndex-beginSliceIndex+1];
for(i = beginSliceIndex; i<=endSliceIndex; i++)
{
dataSlice[i-beginSliceIndex]=data[i];
}
return dataSlice;
}
// Поиск границы
private String getBoundary(HttpServletRequest request)
{
String cType = request.getContentType();
return cType.substring(cType.indexOf("boundary=")+9);
}
}