|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2004
Messaggi: 36
|
Upload JAVA/JSP - Corruzione files binari
Salve,
sto utilizzando questa classe per implementare l'upload di files su un'applicazione java. Codice:
package com.brainysoftware.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletInputStream; import java.util.Dictionary; import java.util.Hashtable; import java.io.PrintWriter; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class FileUploadBean { private String savePath, filepath, filename, contentType; private Dictionary fields; public String getFilename() { return filename; } public String getFilepath() { return filepath; } public void setSavePath(String savePath) { this.savePath = savePath; } public String getContentType() { return contentType; } public String getFieldValue(String fieldName) { if (fields == null || fieldName == null) return null; return (String) fields.get(fieldName); } private void setFilename(String s) { if (s==null) return; int pos = s.indexOf("filename=\""); if (pos != -1) { filepath = s.substring(pos+10, s.length()-1); // Windows browsers include the full path on the client // But Linux/Unix and Mac browsers only send the filename // test if this is from a Windows browser pos = filepath.lastIndexOf("\\"); if (pos != -1) filename = filepath.substring(pos + 1); else filename = filepath; } } private void setContentType(String s) { if (s==null) return; int pos = s.indexOf(": "); if (pos != -1) contentType = s.substring(pos+2, s.length()); } public void doUpload(HttpServletRequest request) throws IOException { ServletInputStream in = request.getInputStream(); byte[] line = new byte[128]; int i = in.readLine(line, 0, 128); if (i < 3) return; int boundaryLength = i - 2; String boundary = new String(line, 0, boundaryLength); //-2 discards the newline character fields = new Hashtable(); while (i != -1) { String newLine = new String(line, 0, i); if (newLine.startsWith("Content-Disposition: form-data; name=\"")) { if (newLine.indexOf("filename=\"") != -1) { setFilename(new String(line, 0, i-2)); if (filename==null) return; //this is the file content i = in.readLine(line, 0, 128); setContentType(new String(line, 0, i-2)); i = in.readLine(line, 0, 128); // blank line i = in.readLine(line, 0, 128); newLine = new String(line, 0, i); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter((savePath==null? "" : savePath) + filename))); while (i != -1 && !newLine.startsWith(boundary)) { // the problem is the last line of the file content // contains the new line character. // So, we need to check if the current line is // the last line. i = in.readLine(line, 0, 128); if ((i==boundaryLength+2 || i==boundaryLength+4) // + 4 is eof && (new String(line, 0, i).startsWith(boundary))) pw.print(newLine.substring(0, newLine.length()-2)); else pw.print(newLine); newLine = new String(line, 0, i); } pw.close(); } else { //this is a field // get the field name int pos = newLine.indexOf("name=\""); String fieldName = newLine.substring(pos+6, newLine.length()-3); //System.out.println("fieldName:" + fieldName); // blank line i = in.readLine(line, 0, 128); i = in.readLine(line, 0, 128); newLine = new String(line, 0, i); StringBuffer fieldValue = new StringBuffer(128); while (i != -1 && !newLine.startsWith(boundary)) { // The last line of the field // contains the new line character. // So, we need to check if the current line is // the last line. i = in.readLine(line, 0, 128); if ((i==boundaryLength+2 || i==boundaryLength+4) // + 4 is eof && (new String(line, 0, i).startsWith(boundary))) fieldValue.append(newLine.substring(0, newLine.length()-2)); else fieldValue.append(newLine); newLine = new String(line, 0, i); } //System.out.println("fieldValue:" + fieldValue.toString()); fields.put(fieldName, fieldValue.toString()); } } i = in.readLine(line, 0, 128); } // end while } } Un file di 35 byte me lo ritrovo illeggibile e di 43 byte. Da cosa può dipendere? dal fatto che tratto il file come una stringa? Come posso intervenire? Grazie! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
scusa, non ho letto tutto il codice, ma mi sembra di aver capito che tu copi il file stringa per stringa, giusto???
se è così, perchè invece non usi la classe file??? se invece non è così, prova a copiarli tramite un buffer di byte invece che tramite una stringa
__________________
My gaming placement |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:39.