私はこのように私の問題を解決しました、
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() を使用して 1 バイトを読み取り、次にコードを実行します。これは、http ヘッダーの場合、他のバイトから最初のバイトを推測できるためです。
count int を使用している場合は、int の代わりに long を使用します。これは、int 変数が制限に達するとストリームが停止する場合があるためです。
int t = inputRequest.read() から返された int 値を fileoutputstream.write(t) に転送してみてください。
inputRequest.available() は、バイト形式の入力ストリームを読み取るにつれて減少し続け、ストリームで使用可能なバイト数を返します。
このようにして、大きなサイズのファイルを破損することなくアップロードできます。
これについてさらに詳細が必要な場合は、コメントを残してください。