【问题标题】:File Upload and convert into bytes using JSP and servlet使用 JSP 和 servlet 上传文件并转换为字节
【发布时间】:2012-09-19 08:42:17
【问题描述】:

我有一个 JSP 页面和一个 servlet。JSP 有两个输入,一个是文件,另一个是文本输入。当用户单击提交按钮时,表单操作指向 Servlet 的 Post()。在 Do Post() 中,我将代码分为两部分。一部分从 Jsp 页面中检索文本输入和文件名,另一部分将文件转换为字节。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
                                                                                    IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();

    //This is 1st part
    //For Converting the File into Stream of Bytes
    String contentType = request.getContentType();
    //System.out.println("Content type is :: " +contentType);

    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
        DataInputStream in = new DataInputStream(request.getInputStream());
        int formDataLength = request.getContentLength();
        byte dataBytes[] = new byte[formDataLength];
        int byteRead = 0;
        int totalBytesRead = 0;
        int k = -1;
        while (totalBytesRead < formDataLength) {
            byteRead = in.read(dataBytes, totalBytesRead, formDataLength);

            totalBytesRead += byteRead;
            //System.out.println(dataBytes[++k]);

        }
        for (int i = 0; i < formDataLength; i++) {
            System.out.print((char)dataBytes[i]);

        }

        System.out.println("Converted");
        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("</HEAD>");
        out.println("<BODY>");
        out.println("<H1>UPLOADED FILE</H1>");
        out.println("<BODY>");
        out.println("</HTML>");
    } else
        System.out.println("asa");


    //This is the 2nd part
    // Create a new file upload handler
    DiskFileUpload upload = new DiskFileUpload();

    // parse request
    List items = null;

    // get uploaded file
    try {
        items = upload.parseRequest(request);
    } catch (FileUploadException e) {
    }
    FileItem file = (FileItem)items.GET(1);
    String DocTitle = file.getName();

    int len = DocTitle.length(), pos = 0, j = 2;
    for (int i = 0; i < len; i++) {

        if (DocTitle.charAt(i) == 46) {
            pos = i;

        }

    }

    String s = DocTitle.substring(pos + 1, len);
    System.out.println("TheContent Type is: " + s);

    // get taget filename
    FileItem name = (FileItem)items.get(1);
    String fileName = name.getString();
    System.out.println("Filename: " + fileName + "." + s);

}

问题是,如果我只运行第一部分或第二部分,代码可以工作,但它们似乎不能一起工作。如果两者放在一起,那么第一部分会被执行,第二部分会抛出

java.lang.IndexOutOfBoundsException:索引:0,大小:0 在 java.util.ArrayList.RangeCheck(ArrayList.java:547)

请帮我解决以上问题

【问题讨论】:

  • 在异常中似乎有一些 ArrayList 对象,但我在您的代码中没有看到。那个 ArrayList 在哪里?
  • 你试过这个答案吗?可能重复:stackoverflow.com/questions/2422468/…
  • 据我了解,这是因为在执行第一部分时它会到达文件末尾,因此当它尝试读取文件时会抛出 ArrayIndexOutOfBoundException。另外,如果我将第二部分放在第 1 部分并且然后执行,然后第一部分不执行,因为 byteRead 负增长,它是在无休止的帮助中引起的。请帮助我一些代码,我可以在其中从 jsp 检索表单字段并将文件转换为字节

标签: jsp servlets file-upload byte indexoutofboundsexception


【解决方案1】:

您的具体错误是您尝试读取 HTTP 请求正文两次。第一次使用request.getInputStream() 显然唯一的目的是将其打印到标准输出(也许是粗心的调试尝试?)。第二次使用 Apache Commons FileUpload。但是,它会通过request.getInputStream() 检索一个完全空的请求正文,因为您已经事先使用了它!客户端不会再次重新发送文件,以便您可以再次读取它(使用 Apache Commons FileUpload)。

完全删除第一个块,它应该可以工作。

哦,请停止阅读roseindia.net。该网站仅显示误导性代码示例,并教授非常糟糕的做法,让初学者完全感到困惑。

另见:

【讨论】:

  • 使用FileItem#get() 将上传的文件作为内存中的byte[] 获取。然后,您可以根据需要多次阅读它。到目前为止,我只是不明白你的代码的第一部分究竟是如何有用的。它似乎只会破坏文件内容。为什么不直接将检索到的文件保存到磁盘?
  • 我不能。我正在使用网络服务,我必须将输入文本字段内容和文件作为字节传递...我不必将其保存在磁盘上。请参考我的新帖子几乎没有改进但再次受到打击。请帮助我stackoverflow.com/questions/12708046/…
  • 然后只需使用FileItem#get(),前提是您已正确删除request.getInputStream()getParameter()等的任何调用,因为它们只会消耗请求正文,如上述答案所述。
  • 请访问此链接。我即将解决此问题,但点击了stackoverflow.com/questions/12708046/…
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2019-01-02
  • 2012-01-31
  • 2013-12-09
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多