ЧаВО по материалам форума
Java на Исходниках.Ру

Составители: Angie, d_k
Редактор: d_k



Загрузка файлов на сервер с помощью Java (d_k)
Данный пример иллюстрирует возможность загружать файлы на сервер с помощью 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);
  }
}


Содержание