使用JSP和servlet上传文件并转换为字节
我有一个JSP页面和一个servlet。JSP有两个输入,一个是文件,另一个是文本输入。当用户单击SUBMIT按钮时,表单操作指向servlet的do Post()我将代码分为两部分,一部分从Jsp页面检索文本输入和文件名,另一部分将文件转换为字节使用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,
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。该网站只展示了误导性的代码示例,并教授了极为糟糕的做法,这让初学者完全困惑
另见:
FileItem\get()
将上载的文件作为内存中的字节[]
。然后你可以想看多少遍就看多少遍。我只是不明白你的代码的第一部分到底有多有用。它似乎只会损坏文件内容。你为什么不直接将检索到的文件保存到磁盘上呢?我不能。我正在使用Web服务,我必须将输入文本字段内容和文件作为字节传递…我不必将其保存在磁盘上。另外,请参阅我的新帖子,我在那里做了一些改进,但又做了一次修改。请帮助我,然后使用FileItem\get()
,前提是您已正确删除对request.getInputStream()
,getParameter()
等的所有调用,因为它们只会消耗请求正文,如上面的回答所述。请访问此链接。我几乎快要解决此问题了,但我被击中了