【问题标题】:Bug reading a Csv File from an http request (WebService)从 http 请求 (WebService) 读取 Csv 文件的错误
【发布时间】:2016-07-04 15:20:51
【问题描述】:

我在尝试从 http 请求读取 csv 文件时遇到此错误。

我的 CSV 文件如下所示:

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

我收到了这个:

idUser,status123,block456,unblock789,block 

不知何故,当我通过 http 请求发送时,它会随着行尾的字符 ('\n') 而消失。我试过很多 Reader,比如 Opencsv 和 javaCsv。并且还通过多种方式接收文件,如InputStream、String、file。似乎错误在请求者中,我也尝试了不同的请求者,例如 Chrome 中的 Postman 和 Firefox 中的 Open HttpRequester。并且还在windows和linux等不同环境下生成文件。我试图将 Windows 发送到 linux,反之亦然。它工作的唯一方法是转换为 Base64 并将其解析为服务内的 csv 文件,但我不希望我的客户一直转换文件。另一种方法是直接从存储库中读取,但不会是 WebService。我现在正在使用 JavaCsv 读取文件https://www.csvreader.com/java_csv_samples.php

我的网络服务:

@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'); 没有成功:/ 提前谢谢!

【问题讨论】:

    标签: java web-services csv restful-architecture


    【解决方案1】:

    您正在使用multipart/form-data。当您有一个带有 <input type="file"> 的表单时使用此内容类型

    要上传文件,您需要一些额外的注释。不幸的是,似乎没有使用 JAX-RS 上传文件的标准方法。取决于实现,例如您可以使用 Jersey、CXF 或 RestEasy。查看此票中的回复Jaxrs multipart

    代码应该是这样的

    @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) {
    

    你有一个完整的例子https://stackoverflow.com/a/25889454/6371459

    【讨论】:

    • 是的,我之前使用过@FormDataParam,但遇到了一些问题,并决定只直接接收一个 InputStream 来让事情正常工作,还有一个 MediaType 为@Consumes({"text/csv"}) 只是为了看看我是否在正确读取文件,然后我得到了没有读取行尾'\ n'的错误。你认为如果我让这个 Multipart_form_data 工作,这个 bug 会修复吗?
    • 您使用的是 html 表单吗?如果没有,只需使用application/octet-stream 以二进制形式发送数据。如果您必须处理表单,那么您需要正确处理文件上传
    • 是的,我的客户将通过 html 表单使用此服务。我将首先使用 multipart 进行处理,然后在此处更新以确认结果。谢谢!
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2018-10-15
    • 1970-01-01
    • 2012-06-17
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多