2016-07-04 2 views
0

http 요청에서 csv 파일을 읽으려고 할 때이 버그가 발생합니다.http 요청 (WebService)에서 Csv 파일을 읽는 중 버그

내 CSV 파일은 다음과 같다 :

idUser,status 
123,block 
456,unblock 
789,block 

그리고이 발생하고 있습니다 : 나는 단순히 줄의 끝의 문자와 함께 사라 요청할 HTTP를 통해 보낼 때 어떻게 든

idUser,status123,block456,unblock789,block 

을 ('\엔'). Opencsv 및 javaCsv와 같은 많은 독자를 시험해 보았습니다. 또한 InputStream, String, file과 같은 여러 가지 방식으로 파일을 받았습니다. 버그가 요청자에있는 것 같아요. Chrome의 우편 배달부와 같은 다른 요청자와 firefox의 Open HttpRequester도 시도했습니다. 또한 Windows 및 Linux와 같은 다양한 환경에서 파일을 생성합니다. 나는 창문을 리눅스와 viceversa에 보내려고했다. 유일한 방법은 Base64로 변환하고 서비스 내부의 csv 파일로 구문 분석하는 것이었지만 내 클라이언트가 파일을 항상 변환하지 못하게했습니다. 다른 방법은 저장소에서 직접 읽는 것이었지만 WebService가 아닙니다. 나는 지금 https://www.csvreader.com/java_csv_samples.php 파일을 읽을 때 JavaCsv를 사용하고 있습니다.

내 웹 서비스 :

@PUT 
@Path("/csvReader") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response editByCsvFile(InputStream csvFileInput){ 
     try { 
      CsvReader csvFile = new CsvReader(new InputStreamReader(csvFileInput)); 
      csvFile.readHeaders(); 
      while (csvFile.readRecord()){ 
       String idUser = csvFile.get("idUser"); 
       String status = csvFile.get("status"); 

       if(status.equals("block")){ 
        blockUser(Long.parseLong(IdUser)); 
       } 
       if(status.equals("unblock")){ 
        unblockUser(Long.parseLong(IdUser)); 
       } 
      } 
      csvFile.close(); 
     } catch (UnsupportedEncodingException ex) { 
      log.info("Unsupported Encoding", ex); 
     } catch (IOException ex) { 
      log.info("IO Exeption", ex); 
     } 
     return Response.ok().build(); 
    } 

내가 직접 구분 csvFile.setDelimiter(',');없이 성공 라인 csvFile.setRecordDelimiter('\n');의 끝을 설정하기 위해 시도했다 :/사전에 감사합니다!

답변

0

multipart/form-data을 사용하고 있습니다. 이 콘텐츠 유형은 양식이 <input type="file"> 인 경우 사용됩니다.

파일을 업로드하려면 몇 가지 추가 주석이 필요합니다. 유감스럽게도 JAX-RS로 파일을 업로드하는 표준 방법은 없다. 구현에 따라 다릅니다. 예를 들어 Jersey, CXF 또는 RestEasy를 사용할 수 있습니다. 이 티켓 Jaxrs multipart

에해야 당신이있어 https://stackoverflow.com/a/25889454/6371459 전체 예제를 가지고이

@PUT 
@Path("/csvReader") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @DefaultValue("true") @FormDataParam("enabled") boolean enabled, 
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail) { 

과 같은 코드를 응답을 참조하십시오.

+0

이전에는 @FormDataParam을 사용했지만 몇 가지 문제가있어 직접 작동하는 InputStream과 MediaType을 @Consumes ({ "text/csv"})로만 수신하기로 결정했습니다. 파일을 올바르게 읽었는지 확인한 다음 '\ n'줄 끝을 읽지 못하는 버그가 있습니다. 이 Multipart_form_data가 작동하면이 버그가 해결 될 것이라고 생각합니까? – Allan

+0

html 양식을 사용하고 있습니까? 그렇지 않다면'application/octet-stream'을 사용하여 데이터를 바이너리로 보내면됩니다. 양식을 처리해야하는 경우 파일 업로드를 올바르게 처리해야합니다. – pedrofb

+0

예, 고객이 HTML 양식을 통해이 서비스를 사용합니다. 먼저 멀티 파트로 작업을 수행 한 다음 여기에서 결과를 확인하여 업데이트합니다. 감사! – Allan