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);
但当我试图下载我得到损坏的文件。帮助我完成我做错的过程。提前谢谢
# 1 楼答案
我读了你的评论,我想我更了解正在发生的事情。再说一遍,如果我错了,请纠正我。根据我收集的信息,您正在尝试上载一个文件,在服务器上使用XSSFWorkbook进行处理,并将输出保存为excel。xlsx电子表格,并将其返回给客户端
这里的问题是,如果输入文件很大,XSSFWorkbook可能需要很长时间来处理它。所以我会用不同的方式来处理这个过程
首先,我要上传我想用POST multipart处理的文件,或者不管它是多么方便。(顺便说一句,现在,{“id”:“docupload”,“body”:{“file”:[{}]}}意味着文件是空的,但我认为您遗漏了数据以保持问题简短)。然后后端将以200OK(或者一个有用的响应,让客户端知道上传失败的原因)进行响应。然后,服务器可以在单独的线程中使用XSSFWorkbook开始处理该文件
其次,客户端可以偶尔轮询服务器处理是否已完成。(或者,此处可以使用WebSocket)。一旦服务器完成处理,它就可以返回一个带有“contentdisposition:attachment”标题的响应
我认为这里的问题在于这样的“繁重”任务是异步的,因为调用者不知道它何时完成(我们可能会得到一个请求超时)
在这种情况下,我认为最好将上传和处理任务拆分为单独的HTTP操作,以保持服务的RESTful
我希望我们能用这个破案!请告诉我进展如何。如果我没有完全理解你的要求,我非常乐意尽力帮助你:D
# 2 楼答案
我尝试重新创建代码,使用toString()方法使其正常工作没有问题:
您是否尝试过使用toString方法()?我希望这有帮助,如果没有请回复!如果可以的话,我很乐意尝试帮助:)