2015-01-09 2 views
5

Я пытаюсь загрузить изображение с помощью веб-сервиса Джерси, я использую джерси-клиент для загрузки изображения. ниже - это веб-сервис jersey, который принимает входной поток и загружает изображение на сервер. она отлично работает, когда я непосредственно вызвать его, используя JSP многослойную форму загрузки, но не когда я загружать изображения с использованием Джерси клиентуJersey Загрузка изображения Клиент

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

Ниже Клиент-Джерси, чтобы загрузить изображение, код клиента является частью другого веб-сервиса, который вызывается из php rest client и этот клиент jersey для того, чтобы загрузить веб-сервис, чтобы загрузить изображение, если я прямо звоню в веб-службу Джерси, чтобы загрузить изображение, которое работает нормально, но оно не работает, когда я загружаю с помощью джерси-клиента.

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) 

Пожалуйста, помогите мне не знать, что мне не хватает здесь. Спасибо.

+0

Можете ли вы уточнить, что «не работает» означает? Я тестировал ваш точный код, используя 'FileInputStream' для' uploadedInputStream', и он отлично работает. Одна вещь, которую я бы изменил (хотя это не вызвало у меня ошибки), является «MediaType.MULTIPART_FORM_DATA_TYPE' для' fdp' для 'MediaType.APPLICATION_OCTET_STREAM_TYPE' –

+0

Я имею в виду, что он передает uploadedInputStream в jersey webservice, но он не содержит таких же куски и тот же тип контента, который мы передали от джерси-клиента. –

+0

Форма данных - основной тип содержимого запроса. Но форма-данные поставляются с частями, и каждая часть имеет собственный тип контента. Файл должен быть октетом-потоком, а не форма-данными –

ответ

10

это полный пример для загрузки изображения с помощью джерси клиента и веб-сервиса ваш клиент код

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

ваш вебсервис

@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); 
     } 
    } 
} 

Полное применение https://github.com/abdotalaat/upladeimageusingjersy

+0

Спасибо, позвольте мне попробовать. –

+0

все в порядке с вами? обратите внимание, что полный проект - проект Netbeans – abdotalaat

+0

Спасибо, он отлично работает ... ' –

Смежные вопросы