gpt4 book ai didi

java - 在 doPost 方法中保存 request.inputstream 数据

转载 作者:行者123 更新时间:2023-12-01 15:41:10 27 4
gpt4 key购买 nike

A类(扩展javax.servlet.http.HttpServlet)中,我声明了一个数组列表(outputList)变量并在其中>doPost 方法 我正在调用 request.getInputStream() 方法并将该流添加到outputList。

在另一个类中,我正在访问我在 A 中声明的相同数组列表。但我无法获取添加到列表中的输入流。我只在调用 outputList.get(index) 时收到空消息。

这是代码:

Class A
{

ArrayList result;

public A(ArrayList al)
{
result = al;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
result.add(request.getInputStream)

}

Class B{
ArrayList result;
public B(ArrayList al){
result = al;
}

public void retreive(){
retreiveing the elements in the result arraylist using an iterator.
}
}

我将相同的数组列表传递给 A 和 B。但是在 B 中的 retreive 方法中,当我尝试读取数组列表的元素时,它们在所有输入流消息中没有任何数据。

最佳答案

您并没有真正传递具体的请求主体,而只是传递指向它的指针(在这种特殊情况下,它位于网络套接字的下面)。因此,当它在其他地方被读取时,或者当您在处理特定请求之后读取它时,它将不再包含任何内容。它将返回 -1 或已经关闭。

您需要将其读入 byte[] 并将其传递。

ByteArrayOutputStream output = new ByteArrayOutputStream();
InputStream input = request.getInputStream();
byte[] buffer = new byte[1024];

for (int length = 0; (length = input.read(buffer)) > -1;)
output.write(buffer, 0, length);
}

byte[] bytes = output.toByteArray();
// Now store bytes in your `ArrayList`.

您只需要注意,这样您的 servlet 就无法再处理 POST 请求,因为您已经消耗了客户端提交的所有内容。客户端不会多次重新发送相同的请求。你需要复印一份。如何实现这一点取决于您在问题中没有提及的功能要求。也许还有其他/更好的方法,例如仅记录 request.getParameterMap()

关于java - 在 doPost 方法中保存 request.inputstream 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com