Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JSP和servlet上传文件并转换为字节_Jsp_Servlets_File Upload_Byte_Indexoutofboundsexception - Fatal编程技术网

使用JSP和servlet上传文件并转换为字节

使用JSP和servlet上传文件并转换为字节,jsp,servlets,file-upload,byte,indexoutofboundsexception,Jsp,Servlets,File Upload,Byte,Indexoutofboundsexception,我有一个JSP页面和一个servlet。JSP有两个输入,一个是文件,另一个是文本输入。当用户单击SUBMIT按钮时,表单操作指向servlet的do Post()我将代码分为两部分,一部分从Jsp页面检索文本输入和文件名,另一部分将文件转换为字节 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,

我有一个JSP页面和一个servlet。JSP有两个输入,一个是文件,另一个是文本输入。当用户单击SUBMIT按钮时,表单操作指向servlet的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);

}
public void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,
IOException{
response.setContentType(内容类型);
PrintWriter out=response.getWriter();
//这是第一部分
//用于将文件转换为字节流
String contentType=request.getContentType();
//System.out.println(“内容类型为::”+contentType);
if((contentType!=null)&&(contentType.indexOf(“多部分/表单数据”)>=0)){
DataInputStream in=新的DataInputStream(request.getInputStream());
int formDataLength=request.getContentLength();
字节数据字节[]=新字节[formDataLength];
int byteRead=0;
int totalBytesRead=0;
int k=-1;
while(totalBytesRead
问题是,如果我只运行第1部分或第2部分,代码可以工作,但它们一起似乎不工作。如果两者都放在一起,那么第一部分执行,第二部分抛出

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


请帮助我解决上述问题,您的具体错误是您试图读取HTTP请求正文两次。第一次使用
request.getInputStream()
的唯一目的显然是将其打印到stdout(可能是一次粗心的调试尝试?)。第二次使用Apache Commons文件上载。但是,它将通过
request.getInputStream()
检索一个完全空的请求正文,因为您事先已经使用了它!客户端不会再次重新发送该文件,以便您可以再次读取它(使用ApacheCommonsFileUpload)

将第一个块全部移除,它应该可以工作

哦,请停止阅读roseindia.net。该网站只展示了误导性的代码示例,并教授了极为糟糕的做法,这让初学者完全困惑

另见:

在异常中似乎有一些ArrayList对象,但我在代码中看到了non。ArrayList在哪?你试过这个答案吗?可能重复:据我所知,这是因为当执行第1部分时,它会到达文件的末尾,因此当它尝试读取文件时,会抛出ArrayIndexOutOfBoundException。此外,如果我将第2部分放在第1部分,然后执行,那么第1部分不会执行,因为字节数会负增长,这是由无休止的错误引起的帮助。请帮我编写一些代码,在这些代码中,我可以从jsp检索表单字段,并将文件转换为字节。使用
FileItem\get()
将上载的文件作为内存中的
字节[]
。然后你可以想看多少遍就看多少遍。我只是不明白你的代码的第一部分到底有多有用。它似乎只会损坏文件内容。你为什么不直接将检索到的文件保存到磁盘上呢?我不能。我正在使用Web服务,我必须将输入文本字段内容和文件作为字节传递…我不必将其保存在磁盘上。另外,请参阅我的新帖子,我在那里做了一些改进,但又做了一次修改。请帮助我,然后使用
FileItem\get()
,前提是您已正确删除对
request.getInputStream()
getParameter()
等的所有调用,因为它们只会消耗请求正文,如上面的回答所述。请访问此链接。我几乎快要解决此问题了,但我被击中了