|
| 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
| |
|
|