Datei-Upload und Konvertierung in bytes (mit JSP und servlet
Ich habe eine JSP-Seite und einem servlet.Die JSP hat zwei Eingaben, eine Datei und die andere ist eine text-Eingabe.Wenn der Benutzer klickt auf den SUBMIT-button das Form-action-Punkte, um Servlet ' s Post zu tun().In die Post() ich habe didvided der code in zwei Teil.Der eine Teil retrives die text-Eingabe und Datei-Namen aus der Jsp-Seite und die andere konvertiert die Datei in bytes.
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);
}
Das problem ist, wenn ich nur laufen, nur der 1. Teil oder 2. Teil der code funktioniert, ist aber gemeinsam, dass Sie nicht zu funktionieren scheint.Wenn beides zusammen dann den 1. Teil ausgeführt werden, und für den 2. Teil wirft es
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
bei java.util.ArrayList.RangeCheck(ArrayList.java:547)
Bitte helfen Sie mir zur Lösung der oben genannten
- In der Ausnahme scheint es einige ArrayList-Objekt, aber das sehe ich nicht in deinem code. Wo ist die ArrayList?
- Haben Sie versucht, diese zu beantworten ? Mögliche Duplikate von: stackoverflow.com/questions/2422468/...
- Soweit mein Verständnis dieses ist weil, wenn der 1. Teil wird ausgeführt, erreicht das Ende der Datei daher, wenn es versucht, die Datei zu Lesen, es wirft ArrayIndexOutOfBoundException.Auch wenn ich den 2. Teil, 1. und führen Sie dann den 1. Teil nicht ausgeführt werden, da byteRead erhöht negativ und es verursacht endlose Hilfe.Bitte helfen Sie mir mit etwas code in die ich kann ermittelt werden das Formularfeld von jsp sowie konvertieren der Datei in bytes
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre konkrete Fehler ist, dass Sie versucht sind, Lesen Sie die HTTP-request-body zweimal. Das erste mal mit
request.getInputStream()
mit anscheinend den ausschließlichen Zweck zu drucken, um die stdout (vielleicht eine unvorsichtige debug-Versuch?). Das zweite mal mit Apache Commons FileUpload. Allerdings wäre es abrufen ein komplett leeres request-body durchrequest.getInputStream()
da hast du schon verbraucht, es vorher! Der client gar nicht mehr re-senden Sie die Datei ein zweites mal, so dass Sie können Lesen Sie es ein zweites mal (mit Apache Commons FileUpload).Entfernen, die 1. Blocks insgesamt, und es sollte funktionieren.
Oh, bitte aufhören zu Lesen roseindia.net. Diese Website zeigt nur irreführende code-Beispiele und lehrt extrem schlechten Praktiken, die verwirrt starter insgesamt.
Siehe auch:
FileItem#get()
um die hochgeladene Datei als eine in-memory -byte[]
. Sie können dann Lesen Sie es so oft wie Sie wollen. Ich Tue nur das, bei weitem nicht verstehen, wie genau der 1. Teil des Codes ist immer nützlich. Es scheint nur die Datei ist beschädigt Inhalt. Warum gehst du nicht einfach speichern die abgerufenen Datei einfach direkt auf die Festplatte?FileItem#get()
werden, vorausgesetzt, Sie haben richtig beseitigt alle Anrufe zurequest.getInputStream()
,getParameter()
etc, als würden Sie verbrauchen nur der request-body, wie in der obigen Antwort.