2015-01-09 30 views
5

Próbuję przesłać obraz za pomocą usługi internetowej Jersey, używam klienta koszulki do przesłania obrazu. poniżej to serwis internetowy firmy Jersey, który pobiera dane wejściowe i przesyła obraz na serwer. to działa dobrze, kiedy bezpośrednio wywołać ją za pomocą JSP wieloczęściowy formularz przesłać ale nie kiedy przesyłać obrazy za pomocą programu Client JerseyKlient przesyłający obraz z Jersey

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceException 
{ 
    // upload code 
} 

Poniżej Jersey Client przesłać obraz, kod klienta jest częścią innej usługi internetowej, która jest wywoływana z php reszta klient i ten klient w koszulce dzwoni do usługi internetowej jersey, aby przesłać obraz, jeśli bezpośrednio zadzwonię do serwisu internetowego Jersey, aby załadować obraz, który działa dobrze, ale nie działa, gdy ładuję za pomocą klienta koszulki.

ClientConfig config = new DefaultClientConfig(); 
Client client = Client.create(config); 
client.setChunkedEncodingSize(1024); 
WebResource wr = client 
     .resource("http://localhost:8080/rest/upload"); 

String contentDisposition = "attachment; filename=\"" 
     + fileDetail.getName() + "\""; 
FormDataMultiPart form = new FormDataMultiPart(); 
ContentDisposition contentDisposition2 = new ContentDisposition(contentDisposition); 
form.setContentDisposition(contentDisposition2); 
FormDataBodyPart fdp = new FormDataBodyPart("file", 
     uploadedInputStream, MediaType.MULTIPART_FORM_DATA_TYPE); 
form.bodyPart(fdp); 
ClientResponse response = wr.type(MediaType.MULTIPART_FORM_DATA).post(
     ClientResponse.class, form) 

Proszę mi pomóc, nie wiem, czego tu brakuje. Dzięki.

+0

Czy możesz wyjaśnić, co "nie działa" znaczy? Przetestowałem z twoim dokładnym kodem, używając typu 'FileInputStream' dla' uploadedInputStream' i działa dobrze. Jedną rzeczą, którą chciałabym zmienić (chociaż nie sprawiło mi to niepowodzenia) to "MediaType.MULTIPART_FORM_DATA_TYPE" dla 'fdp' na' MediaType.APPLICATION_OCTET_STREAM_TYPE' –

+0

Mam na myśli to, że przekazuje uploadedInputStream do usługi web jersey, ale nie zawiera tego samego porcje i ten sam typ zawartości, który przekazaliśmy od klienta koszulki. –

+0

Dane formularzy to główny typ zawartości żądania. Ale dane formularza zawierają części, a każda część ma swój własny typ zawartości. Plik powinien być w postaci strumienia oktetowego, a nie danych formularza. –

Odpowiedz

10

to pełny przykład przesyłanie obrazu za pomocą klienta Jersey i usługa kodować klient

public class Test { 

    private static URI getBaseURI() { 
     return UriBuilder.fromUri("http://localhost:8080/restfullwebservice/resources/generic").build(""); 
    } 

    public static void main(String[] args) throws FileNotFoundException { 
     final ClientConfig config = new DefaultClientConfig(); 
     final Client client = Client.create(config); 

     final WebResource resource = client.resource(getBaseURI()).path("upload"); 

     final File fileToUpload = new File("C:/Users/Public/Pictures/Desert.jpg"); 

     final FormDataMultiPart multiPart = new FormDataMultiPart(); 
     if (fileToUpload != null) { 
      multiPart.bodyPart(new FileDataBodyPart("file", fileToUpload, 
        MediaType.APPLICATION_OCTET_STREAM_TYPE)); 
     } 

     final ClientResponse clientResp = resource.type(
       MediaType.MULTIPART_FORM_DATA_TYPE).post(ClientResponse.class, 
       multiPart); 
     System.out.println("Response: " + clientResp.getClientResponseStatus()); 

     client.destroy(); 
    } 
} 

Twoja usługa

@POST 
@Path("upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public void uploadFile(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceChannelException { 
    OutputStream os = null; 
    try { 
     File fileToUpload = new File("C:/Users/Public/Pictures/Desert1.jpg"); 
     os = new FileOutputStream(fileToUpload); 
     byte[] b = new byte[2048]; 
     int length; 
     while ((length = uploadedInputStream.read(b)) != -1) { 
      os.write(b, 0, length); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     try { 
      os.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Pełna aplikacja https://github.com/abdotalaat/upladeimageusingjersy

+0

Dzięki, pozwól mi spróbować. –

+0

wszystko jest w porządku z tobą? zauważ, że cały projekt to projekt Netbeans – abdotalaat

+0

Dzięki, działa świetnie ... ' –