Avatar billede winston-smith Nybegynder
10. november 2006 - 14:15 Der er 4 kommentarer

Jakarta HTTPClient upload problemer!

Hej,
Efter at have fundet ud af at Suns egne HTTP biblioteker insistere på at buffere alting i hukommelsen før det uploades til en server, (hvilket resulterede i en OutOfMemory exception), så er jeg startet på at se om jeg kan bruge det bibliotek der kommer fra Jakarta. Så strikkede jeg dette kode sammen:
= = = = = = = = = = = = =
String source = "file.zip";
String destination = "http://somewhere.com/perl/db.pl";
try {
    HttpClient client = new HttpClient();
    PostMethod method = new PostMethod(destination);
    method.setRequestHeader("User-Agent", "ascii");
    Part[] parts = {
        new StringPart("action", "uploadfile"),
        new StringPart("project", "lib"),
        new FilePart(source, new File(source))
    };
    method.setRequestEntity(new MultipartRequestEntity(parts,
method.getParams()));
    // Authenticate
    client.getParams().setAuthenticationPreemptive(true);
    Credentials defaultcreds = new UsernamePasswordCredentials("login",
"passwd");
    client.getState().setCredentials(AuthScope.ANY, defaultcreds);
    // Execute the POST method
    int statusCode = client.executeMethod(method);
    if( statusCode != -1 )
    {
        String contents = method.getResponseBodyAsString();
        method.releaseConnection();
        System.out.println( contents );
    }
}


catch(Exception e)
{
    e.printStackTrace();
}


= = = = = = = = = = = = =
Når jeg eksekvere det parses de første parametre ok ("action" & "project"), men koden på serveren der står for validering af parametre stejler over FilePart parameteren som den tager for at være en parameter kaldet “file.zip”. Men selv hvis jeg fjerner dette valideringskode så fejler serveren (i Perl CGI biblioteket) på et senere tidspunkt med en fejl om at den ikke kan finde en File Handle. Alt dette havde jeg allerede haft til at fungere fint med Suns egne Java biblioteker.

Så har jeg prøvet nogle alternative metoder til at overføre parametre:

= = = = = = = = = = = = =
// Configure the form parameters
method.addParameter("project", "lib");
method.addParameter("action", "uploadfile");
= = = = = = = = = = = = =

Men det syntes ikke at være muligt at overføre FiLEs med “addParameter”. Og:

= = = = = = = = = = = = =
NameValuePair[] data = {
    new NameValuePair("project", "lib"),
    new NameValuePair("action", "uploadfile"),
};


filePost.setRequestBody(data);
= = = = = = = = = = = = =
Tager heller ikke FILEs. Og er vist i øvrigt deprecated.

- Hjælp! Jeg skal blot have noget kode der uploader filer til en Apache server der bruger nogle Perl Cgi scripts. Det kan da ikke være så svært?! Hvad gør jeg forkert?
Avatar billede arne_v Ekspert
11. november 2006 - 05:25 #1
Jeg tror at du skal droppe de smarte biblioteker og lave det selv med sockets.
Avatar billede arne_v Ekspert
11. november 2006 - 05:25 #2
Eksempel:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

public class PostBig {
    private final static String BOUNDARY = "AVAV";
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("localhost", 8080);
        OutputStream os = s.getOutputStream();
        PrintStream ps = new PrintStream(os);
        ps.println("POST /test/xuploaddo.jsp HTTP/1.0");
        ps.println("Host: localhost");
        ps.println("Content-Type: multipart/form-data, boundary=" + BOUNDARY);
        ps.println("Content-Length: 282"); // do yourself a favour and code the upload script so it does not require this
        ps.println("");
        ps.println("--" + BOUNDARY);
        ps.println("Content-Disposition: form-data; name=\"beskrivelse\"");
        ps.println("");
        ps.println("test");
        ps.println("--" + BOUNDARY);
        ps.println("Content-disposition: form-data; name=\"fil\"; filename=\"bigfile.txt\"");
        ps.println("Content-type: text/plain");
        ps.println("");
        for(int i = 0; i < 10; i++) {
            ps.println("Linie #" + i);
        }
        ps.println("--" + BOUNDARY + "--");
        ps.flush();
        InputStream is = s.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
        ps.close();
        os.close();
        is.close();
        s.close();
    }
}
Avatar billede arne_v Ekspert
11. november 2006 - 05:27 #3
sender et form felt ved navn beskrivelse med værdien test og et fil felt med navn fil
og filnavn bigfile.txt som er en tekst fil

skal nok tilrettes lidt til dit behov, men ideen bør virke
Avatar billede arne_v Ekspert
10. december 2006 - 01:06 #4
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester