2014-07-08 14 views
8

Chcę napisać prostego klienta 2, aby przesłać plik. Używam Jersey 2.10.1 i napisał następujący kod serwera:Klient wysyłania 2 kart wieloczęściowych

@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” jest klasa zwyczaj, aby zapisać informacje do pliku w bazie danych)

i to jest mój kod klienta :

kod
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(); 
} 

serwer działa bez żadnych problemów, ale kiedy uruchomić klienta pojawia się następujący błąd:

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

Przeszukałem internet w poszukiwaniu dobrego samouczka na temat gry w koszulki 2 i multipart, ale mogę znaleźć tylko samouczki i przykłady dla koszulki 1 lub z formularzem HTML jako "Klient". Mam nadzieję, że somboda może mi pomóc :)

Odpowiedz

25

Znalazłem mój problem. Nie udało mi się ustawić MediaType z MultiPart i ustawiłem oczekiwaną wartość MediaType odpowiedzi na MULTIPART_FORM_DATA. Oto działający kod:

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

Próbuję Twojego rozwiązania i otrzymuję wyjątek niezgodności typu argumentu na serwerze. Czy dokonałeś również zmiany na serwerze? – medloh

+0

Znalazłem problem, musieliśmy to zrobić na naszym serwerze: resourceConfig.register (MultiPartFeature.class); – medloh

+0

Dlaczego twoja prośba przyjmuje typ JSON? Czy nie powinien to być Multipart_form? –

Powiązane problemy