【问题标题】:how to create multipart/mixed request using java如何使用java创建多部分/混合请求
【发布时间】:2021-11-24 19:21:07
【问题描述】:

以下是保存在文件中的上传请求。在运行时我需要读取文件并将占位符 {{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);

但是当我尝试下载时,我得到了损坏的文件。帮助我完成我做错的过程。提前致谢

【问题讨论】:

    标签: java rest multipartform-data document


    【解决方案1】:

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

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

    您是否尝试过使用 toStringMethod()?希望对你有帮助,如果没有请回复!如果可以的话,我很乐意尝试并提供帮助:)

    【讨论】:

    • 感谢分享信息。但我能够转换为字符串并将其添加到内容边界请求中并上传。问题是当我下载我得到损坏的文件时。所以我想知道我需要在我的请求中更改/添加什么
    • 哦,对了,我明白了。看来您正在使用多部分请求,如果您只下载一个文件,我认为没有必要。
    【解决方案2】:

    我已阅读您的评论,我想我更了解正在发生的事情。再次,如果我错了,请纠正我。根据我收集的信息,您正在尝试上传文件,在服务器上使用 XSSFWorkbook 处理它,将输出保存为 excel .xlsx 电子表格,然后将其返回给客户端。

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

    首先,我会上传我想用 POST multipart 处理的文件,或者它可能很方便。 (顺便说一句,现在, {"id":"docupload","body":{"file":[{}]}} 意味着文件是空的,但我假设您错过了数据以保持问题简短) .然后后端将响应 200 OK(或一个有用的响应,让客户端知道上传失败的原因)。然后,服务器可以在单独的线程中使用 XSSFWorkbook 开始处理文件。

    其次,客户端可以偶尔轮询服务器是否处理完成。 (或者,这里可以使用 WebSockets)。服务器完成处理后,它可以返回带有“Content-Disposition: attachment”标头的响应。

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

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

    我希望我们能用这个破案!请让我知道情况如何。如果我没有完全得到您的要求,我很乐意尝试并提供帮助:D

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2016-11-07
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多