これらの日は、バルク転送ファイルを実行するサーバーへのJava Swingクライアントとのプロジェクト直面する問題を行う際に、スタックオーバーフロー例外を報告し、転送が200Mに達しました。コードは次の通りれる:
バイト[]コンテンツ= NULL;
試み{
FIN =新しい新しいFileInputStreamを(ファイル);
ByteArrayOutputStream OUT =新しい新しいByteArrayOutputStream();
バイト[] TEMP =新しい新しいバイト[1024];
int型のサイズ= 0;
しばらく((サイズ= FINを.read(TEMP))= -1){!
out.write(TEMP、0、サイズ);
}
fin.close();
コンテンツ= out.toByteArray();
}キャッチ(例外e){
e.printStackTrace() ;
}
各ファイルストリームのコンテンツの配列へのラウンドロビン方式は、サーバーに送信された一括アップロードは、ファイル名は、サーバーに送信され、その後、コンテンツの配列をファイルに書き込みます。仮想マシン内のこのアプローチベンの崩壊は、javaのより大きな量をファイル。
私の解決策があるにアップロードHTTPメソッド、まだループをやっている、として次の:()以下、このスレッドを実行し、スイングインタフェースにアップロード]ボタンをクリックして
プライベート文字列serverAddressにします。
プライベート静的文字列HTTPHEAD = "のhttp://";
プライベート静的文字列HTTPTAIL = ":8080 / WMS // ReceiveUploadFile"。
プライベート文字列uploadedfilesforlog =「」; //は、ログ保存のためのログ・ファイル名をアップロード
実行可能なアップロードは=新しい実行可能(){
ます。public void実行(){
ファイル[]ファイル= fileChooser.getSelectedFiles();
IF(files.length> 50){
JOptionPane.showMessageDialog(uploadFileDialog.thisは、「アップロードファイルの数が50以上にすることはできません」);
(真)uploadButton.setEnabled。
リターン;
}
StringBufferのuploadedfiles =新しいStringBufferを();
もし(ヌル==ファイル|| files.length == 0){
JOptionPane.showMessageDialog(uploadFileDialog.thisは、「あなたは、音声ファイルを選択していない、アップロードされたオーディオファイルを選択します。」);
(真)uploadButton.setEnabled。
リターン;
}
serverAddressで= dsclient.getServerAddrss()。
{(I ++; I <files.length iが0 = INT)のために
文字列のTargetURL = NULL; // TODO指定URL
ファイルこのtargetFile = NULL; // TODO指定されたファイルのアップロード
このtargetFile =ファイル[i]は、
TargetURL = HTTPHEAD + serverAddressで+ HTTPTAIL。// servleturl
PostMethod filePostは新しいPostMethod(のTargetURL)を=。
//filePost.getParams().setContentCharset("utf-8" );
logger.info(filePost.getParams()getContentCharset()。)。
{試します
//ページパラメータは提出するには、以下の方法でシミュレートすることができます
一部[]部分= {新しいFilePart(targetFile.getName()、このtargetFile)}。
filePost.setRequestEntity(新しいMultipartRequestEntity(部品、filePost.getParams()))。
HttpClientをクライアント=新しいHttpClientを();
client.getHttpConnectionManager()のgetParams()setConnectionTimeout(5000)。。。
int型のステータス= client.executeMethod(filePost)。
IF(ステータス== HttpStatus.SC_OK){
もし(saveAudioFileToDatabase(ファイル[i])と。等号() "アップロードに失敗しました"){
継続する;
}
uploadedfilesforlog + = uploadedfilesforlog.equals( "")?ファイル[i]を.getName(): "" +ファイル[i]の.getName();
SAVELOG( "成功");
logger.info(ファイル[i]の.getName()+ "成功したアップロード");
uploadedfiles.append( "[")。
uploadedfiles.append(ファイル[i]の.getName());
uploadedfiles.append( "]");
IF((I + 1)%5 == 0){
uploadedfiles.append( "<BR>");
}
} そうしないと {
logger.info( "アップロードに失敗しました");
//アップロードに失敗しました
}
}キャッチ(例外例){
ex.printStackTrace();
} 最後に {
filePost.releaseConnection();
}
}
IF(uploadedfiles.length()== 0){
リターン;
}
(真)uploadButton.setEnabled。
文字列の先端= "<HTML>音声ファイル<フォント色= '赤'> <B>"+ Uploadedfiles.toString()+ "する</ b> </ font>アップロードに成功</ HTML>!";
JOptionPane.showMessageDialog(uploadFileDialog.this、チップ);
uploadFileDialog.this.setVisible(偽);
uploadFileDialog.this.dispose();
audioFileManagement.loadList();
}
};
服务器短接受代码:
インポートjava.io.Fileの。
インポートにjava.io.IOException;
インポートに、java.io.PrintStream;
インポートするjava.util.Iterator;
輸入はjava.util.List;
輸入javax.servlet.ServletException;
輸入javax.servlet.http.HttpServlet。
インポートのjavax.servlet.http.HttpServletRequest;
インポートのjavax.servlet.http.HttpServletResponse;
輸入org.apache.commons.fileupload.FileItem;
輸入org.apache.commons.fileupload.disk.DiskFileItemFactory。
輸入org.apache.commons.fileupload.servlet.ServletFileUpload;
輸入org.apache.log4j.Logger;
パブリッククラスReceiveUploadFileはHttpServletを拡張
{
プライベート静的最終長いのserialVersionUID = 1Lと、
ロガーロガー= Logger.getLogger(ReceiveUploadFile.class)。
プライベート文字列uploadPath = "の/ var / libに/ X1000 /サウンド/オーディオファイル/";
プライベート文字列TEMPPATH = "の/ var / libに/ X1000 /サウンド/オーディオファイル/バッファ/";
ファイルtempPathFile;
ます。public void initは()
ServletExceptionがスロー
{
ファイルuploadFile =新しいファイル(this.uploadPathを)。
(!(uploadFile.exists()))であれば
uploadFile.mkdirs();
ファイルtempPathFileは、新しいFile(this.tempPath)を=。
(!(tempPathFile.exists()))であれば
tempPathFile.mkdirs();
}
保護されたボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答)
ServletExceptionが、IOExceptionがスロー
{
doPostメソッド(リクエスト、レスポンス)。
}
公共ボイドのdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)
ServletExceptionが、IOExceptionをスロー
{
DiskFileItemFactory工場;
試す
{
工場=新しいDiskFileItemFactory();
factory.setSizeThreshold(4096)。
factory.setRepository(this.tempPathFile)。
ServletFileUploadアップロード=新しいServletFileUpload(工場)。
upload.setSizeMax(41943040L)。
リスト項目= upload.parseRequest(リクエスト)。
反復子i)は(items.iteratorを=。
一方、(i.hasNext())
{
FileItem Fiの=(FileItem)i.next();
文字列fileNameに= fi.getName()。
(もし!fileNameに= NULL)
{
文字列のファイル名=新しい文字列(。fi.getName()GetBytesメソッド()、 "UTF-8");
this.logger.info( "=======================接收到语音文件的文件名:" +ファイル名);
ファイルのフルファイルは、新しいFile(ファイル名)=。
ファイルsavedFile =新しいファイル(this.uploadPath、fullFile.getName());
fi.write(savedFile)。
}
}
System.out.print( "成功UPLOAD")。
}
キャッチ(例外e)
{
System.out.printlnは(e.getMessage())。
e.printStackTrace();
}
}
}
web.xmlの
<サーブレット>
< サーブレット名> ReceiveUploadFile </ サーブレット名> < 表示名> ReceiveUploadFile </ 表示名> < 説明> ReceiveUploadFile </ 記述> < サーブレットクラス> com.gohigh.centrex.common.ReceiveUploadFile </ サーブレットクラス> < のload-on-startup > 4 </ のload-on-startup > </ サーブレット> - <servlet-mapping >
< サーブレット名> ReceiveUploadFile </ サーブレット名>
< のurl-pattern > / ReceiveUploadFile </ のurl-pattern > </ のservlet-mapping >
依存するJARパッケージ:コモンズ-HTTPClientの-3.1.jar、コモンズ-するFileUpload-1.2.1.jar、コモンズ-CODEC-1.3.jar、
問題が発生しました:中国のゴミ問題、コモンズ-にHTTPClient-3.1.jarパッケージ理由デフォルトのエンコーディングは、それが文字化け解決するには、サーバー中国のファイル名のサーバーに送信され、UTF-8ではありません。オンラインメソッドの多くは読んで
エンコーディングを設定しているが、私が試した、またはではない、我々は唯一のjarパッケージのソースコードを変更することができます。既製パッケージのダウンロードUTF-8ののjarファイル:
http://download.csdn.net/detail/wcbkanaz/3697109、熱心なユーザーのおかげ。
また、サーバーが正しく解決できることを保証するように、コードはあなたが望むものにエンコードされたときに内部のソースコードを変更します。
http://download.csdn.net/detail/yuanxw44/4028099は、ディレクトリのコピー内のファイル解凍し、ソースコードをダウンロードすることができ、このアドレスは、Javaの内部で、必要性が日食の下に二つのパッケージSRCディレクトリに依存することができます
コモンズ-logging.jarとコモンズ - codec.jar、再びfatjarで遊んで修正しました。
コモンズ-HTTPClientの-3.1.jar
コモンズ・ファイルアップロード-1.2.1。
コモンズ・ファイルアップロード-1.2.1。
コモンズ・コーデック-1.3.jar