我这样解决了我的问题,
while (inputRequest.available()>0) {
try {
int t = inputRequest.read();
ch = (char) t;
//here i checked each byte data
} catch (IOException e) {
}
}
问题是输入流具有 http 标头字段以及位于流中任何位置的文件内容,因此我首先将字节存储在临时字符串中,直到在流中获得 '\r' 和 '\n' 。通过这种方式,我得到了 multipart/form-data HTTP 标头的边界,然后我比较了临时字符串,直到找到边界和其他已知标头内容,然后我将输入流发送到文件输出流。但在某些情况下,标题可能在文件内容之后包含其他内容,因此它肯定会有一个结束边界,所以我不断跟踪我读取的每个字节,然后我将每个字节单独发送到文件输出流。这是示例 http 标头-
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://localhost/index.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------274761981030199
Content-Length: 1405
-----------------------------274761981030199
Content-Disposition: form-data; name="name1"
pppppp
-----------------------------274761981030199
Content-Disposition: form-data; name="name2"
rrrrrrrrr
-----------------------------274761981030199
Content-Disposition: form-data; name="name3"
eeeeeeee
-----------------------------274761981030199
Content-Disposition: form-data; name="name4"
2
-----------------------------274761981030199
Content-Disposition: form-data; name="name5"; filename="CgiPost.java"
Content-Type: text/x-java-source
import java.io.*;
// This appears in Core Web Programming from
// Prentice Hall Publishers, and may be freely used
// or adapted. 1997 Marty Hall, hall@apl.jhu.edu.
public class CgiPost extends CgiGet
{
public static void main(String[] args)
{
try
{
DataInputStream in
= new DataInputStream(System.in);
String[] data = { in.readLine() };
CgiPost app = new CgiPost("CgiPost", data, "POST");
app.printFile();
} catch(IOException ioe) {
System.out.println
("IOException reading POST data: " + ioe);
}
}
public CgiPost(String name, String[] args,
String type) {
super(name, args, type);
}
}
-----------------------------274761981030199
Content-Disposition: form-data; name="name6"
pppppppppp
-----------------------------274761981030199--
注意:在某些情况下,您的应用程序代码可能会到达 inputRequest.available() 但浏览器尚未发送请求,在这种情况下 inputRequest.available() 将始终返回 0 并且您的 while 循环将立即退出。为了避免这种情况,首先使用 inputRequest.read() 读取一个字节,然后执行代码,因为在 http 标头的情况下,您可以猜测其他字节的第一个字节。
如果您使用一些 count int,则使用 long 而不是 int,因为流在某些情况下会在 int 变量达到其限制的情况下停止。
尝试将 int t = inputRequest.read() 返回的 int 值传输到 fileoutputstream.write(t)。
inputRequest.available() 在您读取字节形式的输入流时不断减少,它返回流中可用的字节数。
通过这种方式,您可以上传大尺寸文件,而不会出现任何损坏。
如果有人需要有关此的更多详细信息,请留下您的评论。