| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | JSP: Upload af filer Fra : Kasper Johansen | 
  Dato :  06-12-06 04:25 |  
  |   
            Hej igen gruppe.
 
 Jeg forsøger at lave et filuploadings-script. Jeg forsøger at uploade et
 billede, som der er 62.009 bytes stort. Alligevel kan det uploadede
 billede ikke vises, da det indeholdet korrupt data (siger
 billede-programmet). Det originale billede, kan dog stadig vises.
 
 Det er følgende kode, som der uploader billedet. Kan nogen give mig et
 peg om, hvad jeg gør forkert?
 
 
 //input som henter HTTP-formdata-request.
 DataInputStream in = new DataInputStream(request.getInputStream());
 
 //total længde af formdata-request.
 int data_length = request.getContentLength();
 
 //buffer til hentning af data.
 byte data_bytes[] = new byte[data_length];
 
 //så vi ved, hvor langt vi er nået.
 int data_read = 0;
 int data_read_total = 0;
 
 //hent data.
 while(data_read_total < data_length){
    data_read = in.read(data_bytes, data_read, data_length);
    data_read_total += data_read;
 }
 
 //konverter til string.
 String tha_data = new String(data_bytes);
 
 //find ud af hvor billededata ligger i vores string.
 //der skal findes 62.009
 int tha_code_pos = tha_data.indexOf("\n") - 1;
 
 String tha_code = tha_data.substring(0, tha_code_pos);
 String tha_code_search = "\r\n" + tha_code + "--\r\n";
 
 int picd_pos_start = tha_data.indexOf("\r\n\r\n") + 4;
 int picd_pos_end = tha_data.indexOf(tha_code_search);
 
 int new_from = picd_pos_end + tha_code_search.length();
 String tha_new_data = tha_data.substring(picd_pos_start, picd_pos_end);
 tha_new_data += tha_data.substring(new_from);
 //tha_new_data er nu 62.009 lang, som er fundet via
 out.print(tha_new_data.length());
 
 //gem billede som fil.
 FileWriter save_file = new FileWriter("/var/www/test.jpg");
 save_file.write(tha_new_data);
 save_file.close();
 
 
 -- 
 Med venlig hilsen
 Kasper Johansen
  
            
             |   |   
            
        
 
            
         
           Arne Vajhøj (06-12-2006) 
         
	
            | Kommentar Fra : Arne Vajhøj | 
  Dato :  06-12-06 04:44 |  
  |   
            Kasper Johansen wrote:
 > Jeg forsøger at lave et filuploadings-script. Jeg forsøger at uploade et
 > billede, som der er 62.009 bytes stort. Alligevel kan det uploadede
 > billede ikke vises, da det indeholdet korrupt data (siger
 > billede-programmet). Det originale billede, kan dog stadig vises.
 > 
 > Det er følgende kode, som der uploader billedet. Kan nogen give mig et
 > peg om, hvad jeg gør forkert?
 > 
 > //input som henter HTTP-formdata-request.
 > DataInputStream in = new DataInputStream(request.getInputStream());
 > 
 > //total længde af formdata-request.
 > int data_length = request.getContentLength();
 > 
 > //buffer til hentning af data.
 > byte data_bytes[] = new byte[data_length];
 > 
 > //så vi ved, hvor langt vi er nået.
 > int data_read = 0;
 > int data_read_total = 0;
 > 
 > //hent data.
 > while(data_read_total < data_length){
 >     data_read = in.read(data_bytes, data_read, data_length);
 >     data_read_total += data_read;
 > }
 > 
 > //konverter til string.
 > String tha_data = new String(data_bytes);
 > 
 > //find ud af hvor billededata ligger i vores string.
 > //der skal findes 62.009
 > int tha_code_pos = tha_data.indexOf("\n") - 1;
 > 
 > String tha_code = tha_data.substring(0, tha_code_pos);
 > String tha_code_search = "\r\n" + tha_code + "--\r\n";
 > 
 > int picd_pos_start = tha_data.indexOf("\r\n\r\n") + 4;
 > int picd_pos_end = tha_data.indexOf(tha_code_search);
 > 
 > int new_from = picd_pos_end + tha_code_search.length();
 > String tha_new_data = tha_data.substring(picd_pos_start, picd_pos_end);
 > tha_new_data += tha_data.substring(new_from);
 > //tha_new_data er nu 62.009 lang, som er fundet via
 > out.print(tha_new_data.length());
 > 
 > //gem billede som fil.
 > FileWriter save_file = new FileWriter("/var/www/test.jpg");
 > save_file.write(tha_new_data);
 > save_file.close();
 
 1) Jeg mener faktisk at request.getInputStream() kun returnerer body
     ikke HTTP headere. D.v.s. at du skal ikke lede efter \r\n.
 
 2) Konvertering til String og udskrift med Writer af en binær fil
     som JPG er skal gå galt.
 
 3) Du bør nok "snyde" lidt og bruge f.eks. Jakarta FileUpload.
 
     Eksempel på upload JSP side:
 
 <%@page import="org.apache.commons.fileupload.*,java.util.*,java.io.*"%>
 <%
 DiskFileUpload upload = new DiskFileUpload();
 List files = upload.parseRequest(request);
 for(int i = 0; i < files.size(); i++) {
     FileItem file = (FileItem)files.get(i);
     if(file.getSize() > 0) {
        String filename = "C:\\" + file.getFieldName() + ".upl";
        file.write(new File(filename));
     }
 }
 %>
 
 Arne
 
 
  
            
             |   |   
            
        
 
            
         
           Kasper Johansen (06-12-2006) 
         
	
            | Kommentar Fra : Kasper Johansen | 
  Dato :  06-12-06 06:29 |  
  |   
            Arne Vajhøj skrev:
 > 2) Konvertering til String og udskrift med Writer af en binær fil
 >    som JPG er skal gå galt.
 Det prøver jeg at lege med så.
 
 
 > 3) Du bør nok "snyde" lidt og bruge f.eks. Jakarta FileUpload.
 Det er til noget skole-opgave, hvor jeg skal demonstrere, at jeg ved et 
 og andet om HTTP sammen med JSP. Så det er mere for at demonstrere en 
 forståelse for protokollen og JSP - desværre :'(
 
 
 -- 
 Med venlig hilsen
 Kasper Johansen
  
            
             |   |   
            
        
 
            
         
            Kasper Johansen (06-12-2006) 
         
	
            | Kommentar Fra : Kasper Johansen | 
  Dato :  06-12-06 09:48 |  
  |   
            Kasper Johansen skrev:
 > Arne Vajhøj skrev:
 >> 2) Konvertering til String og udskrift med Writer af en binær fil
 >>    som JPG er skal gå galt.
 > Det prøver jeg at lege med så.
 
 Jeg har nu forsøgt med nederstående kode, som der faktisk tegner den 
 øverste del af billedet. Den laver også billedet med en fuld stændig 
 identisk filstørrelse.
 
 Dog kan jeg kun se den øverste del af billedet (altså første multipart?).
 
 Hvis jeg fjerner skrivningen af anden del, så vises billedet stadig på 
 præcis samme måde (dog fylder det kun 12kb). Det er altså anden del, som 
 den er gal med.
 
 På baggrund af dit svar, så læser jeg nu kun possitioner via min streng. 
 Jeg skriver på baggrund af disse possitioner fra mit byte-array. Jeg har 
 testet det således, at multipart-koden, som der skal findes før anden 
 del af billedet, rent faktisk findes - og det gør den på den angivne 
 position (altså picd_second_start og picd_second_end).
 
 Jeg kan igen ikke rigtig overskue, hvor den går galt henne. Kan nogen 
 hjælpe?
 
 
 
 String tha_filename = "/var/www/test.jpg";
 
 //input som henter HTTP-formdata-request.
 DataInputStream in = new DataInputStream(request.getInputStream());
 
 //total længde af formdata-request.
 int data_length = request.getContentLength();
 
 //buffer til hentning af data.
 byte data_bytes[] = new byte[data_length];
 
 //så vi ved, hvor langt vi er nået.
 int data_read = 0;
 int data_read_total = 0;
 
 //hent data.
 while(data_read_total < data_length){
    data_read = in.read(data_bytes, data_read, data_length);
    data_read_total += data_read;
 }
 
 //konverter til læsbar string.
 String tha_data = new String(data_bytes);
 
 //find ud af hvor billededata ligger i vores string.
 int tha_code_pos = tha_data.indexOf("\r\n");
 String tha_code = tha_data.substring(0, tha_code_pos);
 String tha_code_search = "\r\n" + tha_code + "--\r\n";
 
 int picd_first_start = tha_data.indexOf("\r\n\r\n") + 4;
 int picd_first_end = tha_data.indexOf(tha_code_search);
 
 int picd_second_start = picd_first_end + tha_code_search.length();
 int picd_second_end = tha_data.length();
 
 //gem billede som fil.
 FileOutputStream save_file = new FileOutputStream(tha_filename);
 save_file.write(data_bytes, picd_first_start, (picd_first_end - 
 picd_first_start));
 save_file.write(data_bytes, picd_second_start, (picd_second_end - 
 picd_second_start));
 save_file.close();
 
 
 -- 
 Med venlig hilsen
 Kasper Johansen
  
            
             |   |   
            
        
 
            
         
           Thorbjørn Ravn Ander~ (06-12-2006) 
         
	
            | Kommentar Fra : Thorbjørn Ravn Ander~ | 
  Dato :  06-12-06 05:02 |  
  |  
 
            Kasper Johansen <kaspernj@gmail.com> writes:
 > Det er følgende kode, som der uploader billedet. Kan nogen give mig et
 > peg om, hvad jeg gør forkert?
 Du kan kigge i kildeteksten til Jakarta Commons FileUpload modulet,
 for at se hvordan de gør der.
 http://jakarta.apache.org/commons/fileupload/using.html
-- 
   Thorbjørn Ravn Andersen
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |