2014-07-08 14 views
8

Ich möchte einen einfachen Jersey 2 Client schreiben, um eine Datei hochzuladen. Ich verwende Jersey 2.10.1 und schrieb folgenden Servercode:Jersey 2 Multipart Upload Client

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response uploadFile(
     @FormDataParam("file") InputStream aUploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition aFileDetail) { 

    UploadedFile uploadedFile = new UploadedFile(); 
    uploadedFile.setOriginalFileName(aFileDetail.getFileName()); 
    uploadedFile.setFileSize(aFileDetail.getSize()); 
    saveToFile(aUploadedInputStream, aFileDetail.getType(), uploadedFile); 
    databaseHelper.saveInDatabase(uploadedFile); 

    return Response.status(200).build(); 
} 

(„UploadedFile“ ist eine benutzerdefinierte Klasse, die Informationen der Datei in einer Datenbank zu speichern)

Und das ist mein Client-Code :

private static final String TARGET_URL = "http://localhost:49158/rest/service/upload"; 

public Slimclient() { 
    Client client = ClientBuilder.newBuilder() 
      .register(MultiPartFeature.class).build(); 
    WebTarget webTarget = client.target(TARGET_URL); 
    MultiPart multiPart = new MultiPart(); 

    FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file", 
      new File("C:/Users/Nicklas2751/Desktop/test.txt"), MediaType.APPLICATION_OCTET_STREAM_TYPE); 
    multiPart.bodyPart(fileDataBodyPart); 

    Response response = webTarget.request(
      MediaType.MULTIPART_FORM_DATA).post(
      Entity.entity(multiPart, multiPart.getMediaType())); 

    System.out.println(response.getStatus()+" "+response.getStatusInfo()+" "+response); 
} 

public static void main(String[] args) { 
    new Slimclient(); 
} 

die Server-Code läuft ohne Probleme, aber wenn ich ausführen, um den Client ich die folgenden Fehlermeldung erhalten:

415 Unsupported Media Type InboundJaxrsResponse{ClientResponse{method=POST, uri=http://localhost:49158/rest/service/upload, status=415, reason=Unsupported Media Type}} 

Ich suchte im Internet nach einem guten Tutorial für Trikot 2 und Multipart Fileupload, aber ich finde Tutorials und Beispiele nur für Trikot 1 oder mit einem HTML-Formular als "Client". Ich hoffe sombody kann mir helfen :)

Antwort

25

Ich habe mein Problem gefunden. Ich habe verpasst, die MediaType der MultiPart zu setzen und mit der .request(MediaType.MULTIPART_FORM_DATA) habe ich die erwartete MediaType der Antwort auf MULTIPART_FORM_DATA gesetzt. Hier ist der Arbeitscode:

public class Slimclient { 
    private static final String TARGET_URL = "http://localhost:49158/rest/service/upload"; 

    public Slimclient() { 
     Client client = ClientBuilder.newBuilder() 
      .register(MultiPartFeature.class).build(); 
     WebTarget webTarget = client.target(TARGET_URL); 
     MultiPart multiPart = new MultiPart(); 
     multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE); 

     FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file", 
      new File("C:/Users/Nicklas/Desktop/aab.txt"), 
      MediaType.APPLICATION_OCTET_STREAM_TYPE); 
     multiPart.bodyPart(fileDataBodyPart); 

     Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE) 
      .post(Entity.entity(multiPart, multiPart.getMediaType())); 

     System.out.println(response.getStatus() + " " 
      + response.getStatusInfo() + " " + response); 
    } 

    public static void main(String[] args) { 
     new Slimclient(); 
    } 
} 
+0

Ich versuche Ihre Lösung und ich bekomme eine Argumenttyp Mismatch-Ausnahme auf dem Server. Haben Sie auch den Server gewechselt? – medloh

+0

Das Problem wurde gefunden, wir mussten dies auf unserem Server tun: resourceConfig.register (MultiPartFeature.class); – medloh

+0

Warum nimmt Ihre Anfrage den JSON-Typ an? Sollte es nicht Multipart_form sein? –

Verwandte Themen