有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

rest如何使用java创建多部分/混合请求

下面是保存在文件中的上载请求。在运行时,我需要读取文件并替换占位符{{stream}}以输入流数据(我需要上传的文件的流数据)

--Content Boundary
Content-Disposition: form-data; name="metadata"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit

{"id":"docupload","body":{"file":[{}]}}

--Content Boundary
Content-Disposition: form-data; name="inputFile"; filename="file1.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Transfer-Encoding: binary

{{stream}}
--Content Boundary--

我使用下面的方法将上传文件的数据流转换为字符串,然后我将替换为占位符

 ByteArrayOutputStream bos = new ByteArrayOutputStream();             
 workbook.write(bos); // workbook is instance of XSSFWorkbook which I used to create at runtime
 return new String(bos.toByteArray(), StandardCharsets.UTF_8);

但当我试图下载我得到损坏的文件。帮助我完成我做错的过程。提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    我读了你的评论,我想我更了解正在发生的事情。再说一遍,如果我错了,请纠正我。根据我收集的信息,您正在尝试上载一个文件,在服务器上使用XSSFWorkbook进行处理,并将输出保存为excel。xlsx电子表格,并将其返回给客户端

    这里的问题是,如果输入文件很大,XSSFWorkbook可能需要很长时间来处理它。所以我会用不同的方式来处理这个过程

    首先,我要上传我想用POST multipart处理的文件,或者不管它是多么方便。(顺便说一句,现在,{“id”:“docupload”,“body”:{“file”:[{}]}}意味着文件是空的,但我认为您遗漏了数据以保持问题简短)。然后后端将以200OK(或者一个有用的响应,让客户端知道上传失败的原因)进行响应。然后,服务器可以在单独的线程中使用XSSFWorkbook开始处理该文件

    其次,客户端可以偶尔轮询服务器处理是否已完成。(或者,此处可以使用WebSocket)。一旦服务器完成处理,它就可以返回一个带有“contentdisposition:attachment”标题的响应

    我认为这里的问题在于这样的“繁重”任务是异步的,因为调用者不知道它何时完成(我们可能会得到一个请求超时)

    在这种情况下,我认为最好将上传和处理任务拆分为单独的HTTP操作,以保持服务的RESTful

    我希望我们能用这个破案!请告诉我进展如何。如果我没有完全理解你的要求,我非常乐意尽力帮助你:D

  2. # 2 楼答案

    我尝试重新创建代码,使用toString()方法使其正常工作没有问题:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
            System.out.println(bos.toString(StandardCharsets.UTF_8););
        } catch (IOException e) {
            e.printStackTrace();
        }
    

    您是否尝试过使用toString方法()?我希望这有帮助,如果没有请回复!如果可以的话,我很乐意尝试帮助:)