如何在Web页上实现文件上传

80酷酷网    80kuku.com

  web|上传

public class UploadServlet extends HttpServlet

{

  //default maximum allowable file size is 100k

  static final int MAX_SIZE = 102400;

  //instance variables to store root and success message

  String rootPath, successMessage;

  /**

   * init method is called when servlet is initialized.

   */

  public void init(ServletConfig config) throws ServletException

  {

    super.init(config);

    //get path in which to save file

    rootPath = config.getInitParameter("RootPath");

    if (rootPath == null)

    {

      rootPath = "/";

    }

    /*Get message to show when upload is complete. Used only if

      a success redirect page is not supplied.*/

    successMessage = config.getInitParameter("SuccessMessage");

    if (successMessage == null)

    {

      successMessage = "File upload complete!";

    }

  }

  /**

   * doPost reads the uploaded data from the request and writes

   * it to a file.

   */

  public void doPost(HttpServletRequest request,

    HttpServletResponse response)

  {

    ServletOutputStream out=null;

    DataInputStream in=null;

    FileOutputStream fileOut=null;

    try

    {

      /*set content type of response and get handle to output

        stream in case we are unable to redirect client*/

      response.setContentType("text/plain");

      out = response.getOutputStream();

    }

    catch (IOException e)

    {

      //print error message to standard out

      System.out.println("Error getting output stream.");

      System.out.println("Error description: " + e);

      return;

    }

    try

    {

      //get content type of client request

      String contentType = request.getContentType();

      //make sure content type is multipart/form-data

      if(contentType != null && contentType.indexOf(

        "multipart/form-data") != -1)

      {

        //open input stream from client to capture upload file

        in = new DataInputStream(request.getInputStream());

        //get length of content data

        int formDataLength = request.getContentLength();

        //allocate a byte array to store content data

        byte dataBytes[] = new byte[formDataLength];

        //read file into byte array

        int bytesRead = 0;

        int totalBytesRead = 0;

        int sizeCheck = 0;

        while (totalBytesRead < formDataLength)

        {

          //check for maximum file size violation

          sizeCheck = totalBytesRead + in.available();

          if (sizeCheck > MAX_SIZE)

          {

            out.println("Sorry, file is too large to upload.");

            return;

          }

          bytesRead = in.read(dataBytes, totalBytesRead,

            formDataLength);

          totalBytesRead += bytesRead;

        }

        //create string from byte array for easy manipulation

        String file = new String(dataBytes);

        //since byte array is stored in string, release memory

        dataBytes = null;

        /*get boundary value (boundary is a unique string that

          separates content data)*/

        int lastIndex = contentType.lastIndexOf("=");

        String boundary = contentType.substring(lastIndex+1,

          contentType.length());

        //get Directory web variable from request

        String directory="";

        if (file.indexOf("name=\"Directory\"") > 0)

        {

          directory = file.substring(

            file.indexOf("name=\"Directory\""));

          //remove carriage return

          directory = directory.substring(

            directory.indexOf("\n")+1);

          //remove carriage return

          directory = directory.substring(

            directory.indexOf("\n")+1);

          //get Directory

          directory = directory.substring(0,

            directory.indexOf("\n")-1);

          /*make sure user didn't select a directory higher in

            the directory tree*/

          if (directory.indexOf("..") > 0)

          {

            out.println("Security Error: You can't upload " +

              "to a directory higher in the directory tree.");

            return;

          }

        }

        //get SuccessPage web variable from request

        String successPage="";

        if (file.indexOf("name=\"SuccessPage\"") > 0)

        {

          successPage = file.substring(

            file.indexOf("name=\"SuccessPage\""));

          //remove carriage return

          successPage = successPage.substring(

            successPage.indexOf("\n")+1);

          //remove carriage return

          successPage = successPage.substring(

            successPage.indexOf("\n")+1);

          //get success page

          successPage = successPage.substring(0,

            successPage.indexOf("\n")-1);

        }

        //get OverWrite flag web variable from request

        String overWrite;

        if (file.indexOf("name=\"OverWrite\"") > 0)

        {

          overWrite = file.substring(

            file.indexOf("name=\"OverWrite\""));

          //remove carriage return

          overWrite = overWrite.substring(

            overWrite.indexOf("\n")+1);

          //remove carriage return

          overWrite = overWrite.substring(

            overWrite.indexOf("\n")+1);

          //get overwrite flag

          overWrite = overWrite.substring(0,

            overWrite.indexOf("\n")-1);

        }

        else

        {

          overWrite = "false";

        }

        //get OverWritePage web variable from request

        String overWritePage="";

        if (file.indexOf("name=\"OverWritePage\"") > 0)

        {

          overWritePage = file.substring(

            file.indexOf("name=\"OverWritePage\""));

          //remove carriage return

          overWritePage = overWritePage.substring(

            overWritePage.indexOf("\n")+1);

          //remove carriage return

          overWritePage = overWritePage.substring(

            overWritePage.indexOf("\n")+1);

          //get overwrite page

          overWritePage = overWritePage.substring(0,

            overWritePage.indexOf("\n")-1);

        }

        //get filename of upload file

        String saveFile = file.substring(

          file.indexOf("filename=\"")+10);

        saveFile = saveFile.substring(0,

          saveFile.indexOf("\n"));

        saveFile = saveFile.substring(

          saveFile.lastIndexOf("\\")+1,

          saveFile.indexOf("\""));

        /*remove boundary markers and other multipart/form-data

          tags from beginning of upload file section*/

        int pos; //position in upload file

        //find position of upload file section of request

        pos = file.indexOf("filename=\"");

        //find position of content-disposition line

        pos = file.indexOf("\n",pos)+1;

        //find position of content-type line

        pos = file.indexOf("\n",pos)+1;

        //find position of blank line

        pos = file.indexOf("\n",pos)+1;

        /*find the location of the next boundary marker

          (marking the end of the upload file data)*/

        int boundaryLocation = file.indexOf(boundary,pos)-4;

        //upload file lies between pos and boundaryLocation

        file = file.substring(pos,boundaryLocation);

        //build the full path of the upload file

        String fileName = new String(rootPath + directory +

          saveFile);

        //create File object to check for existence of file

        File checkFile = new File(fileName);

        if (checkFile.exists())

        {

          /*file exists, if OverWrite flag is off, give

            message and abort*/

          if (!overWrite.toLowerCase().equals("true"))

          {

            if (overWritePage.equals(""))

            {

              /*OverWrite HTML page URL not received, respond

                with generic message*/

              out.println("Sorry, file already exists.");

            }

            else

            {

              //redirect client to OverWrite HTML page

              response.sendRedirect(overWritePage);

            }

            return;

          }

        }

        /*create File object to check for existence of

          Directory*/

        File fileDir = new File(rootPath + directory);

        if (!fileDir.exists())

        {

          //Directory doesn't exist, create it

          fileDir.mkdirs();

        }

        //instantiate file output stream

        fileOut = new FileOutputStream(fileName);

        //write the string to the file as a byte array

        fileOut.write(file.getBytes(),0,file.length());

        if (successPage.equals(""))

        {

          /*success HTML page URL not received, respond with

            generic success message*/

          out.println(successMessage);

          out.println("File written to: " + fileName);

        }

        else

        {

          //redirect client to success HTML page

          response.sendRedirect(successPage);

        }

      }

      else //request is not multipart/form-data

      {

        //send error message to client

        out.println("Request not multipart/form-data.");

      }

    }

    catch(Exception e)

    {

      try

      {

        //print error message to standard out

        System.out.println("Error in doPost: " + e);

        //send error message to client

        out.println("An unexpected error has occurred.");

        out.println("Error description: " + e);

      }

      catch (Exception f) {}

    }

    finally

    {

      try

      {

        fileOut.close(); //close file output stream

      }

      catch (Exception f) {}

      try

      {

        in.close(); //close input stream from client

      }

      catch (Exception f) {}

      try

      {

        out.close(); //close output stream to client

      }

      catch (Exception f) {}

    }

  }

}








分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: