javawebアップロードファイル
一部のJSPファイルのアップロード
ファイルのアップロードも、あなたも、AJAXを使用してバックエンドにリクエストを送信することができ、要求のバックエンドを送信するために、フォームのフォームを使用することができます
バックエンドフォームフォームに要求を送信することによって、1
<フォームID = "postForm" ACTION = "$ {pageContext.request.contextPath} / UploadServlet" METHOD = "POST" のenctype = "マルチパート/フォームデータ">
<DIV CLASS = "bbxxラップ">
<inputtype =「テキスト」ID =「サイドプロファイル名」NAME =「ユーザ名」クラス=「フォームコントロール」>
<inputtype = "ファイル" ID = "例ファイル入力" NAME = "アバター">
<ボタンタイプ= "提出" クラス= "BTN BTN-効果リップルBTN-主">保存</ボタン>
</ div>
</フォーム>
改善されたコードラベルは、直接制御により実現し、フォームに必要はありません。開発者は、唯一可能なビジネスロジックに集中する必要があります。JSは、より良い私たちを助けるために閉鎖されました
this.post_file =関数()
{
$ .each(this.ui.btn、関数(I、N){n.hide();});
this.ui.btn.stop.show();
this.State = this.Config.state.Posting; //
this.app.postFile({ID:this.fileSvr.id、pathLoc:this.fileSvr.pathLoc、pathSvr:this.fileSvr.pathSvr、lenSvr:this.fileSvr.lenSvr、フィールド:this.fields})。
}。
コントロールは、監視ツール、非常に明確な、非常に簡単なデバッグを通じて送信されたデータを見ることができます。
AJAXを経由してバックエンドにリクエストを送信します。2.
$アヤックス({
URL: "$ {pageContext.request.contextPath} / UploadServlet"、
タイプ: "POST"、
データ:$( '#postForm')にserialize()、
成功:機能(データ){
$( '#serverResponse')HTML(データ)。
}、
エラー:関数(データ){
$( '#serverResponse')HTML(data.status + ":" + data.statusText + ":" + data.responseText);。
}
});
AJAXは、2つの部分、初期化の部分に分割され、サーバの初期化操作の前にファイルアップロード要求通知は、AJAXによって行わ
this.md5_complete =関数(JSON)
{
this.fileSvr.md5 = json.md5。
this.ui.msg.text(「MD5の計算は、サーバーに接続して、完成されました...」);
this.event.md5Complete(これ、json.md5); //ビズイベント
VAR loc_path = encodeURIComponentで(this.fileSvr.pathLoc)。
VAR loc_len = this.fileSvr.lenLoc。
VAR loc_size = this.fileSvr.sizeLoc。
VAR PARAM = jQuery.extend({}、this.fields、this.Config.bizData、{MD5:json.md5、ID:this.fileSvr.id、lenLoc:loc_len、sizeLoc:loc_size、pathLoc:loc_path、時間:新しいです日付()getTime()})。
$アヤックス({
タイプ: "GET"
、データ型: 'JSONP'
、JSONPは:JSONPから「コールバック」//コールバック関数名定義され、デフォルトのランダム関数名が自動的にjQueryのために生成されています
、URL:this.Config [ "UrlCreate"]
、データ:PARAM
成功:機能(SV)
{
_this.svr_create(SV)。
}
エラー:関数(REQ、TXT、ERR)
{
_this.Manager.RemoveQueuePost(_this.fileSvr.id)。
警告(+ req.responseText「!MD5メッセージは、サーバーエラーに送信されました」);
(「サーバーエラーにMD5の送信情報」)_this.ui.msg.text。
_this.ui.btn.cancel.show()。
_this.ui.btn.stop.hide()。
}
完全:関数(REQ、STA){REQ = NULL; }
});
}。
通知は、ファイルのアップロード後にサーバに送信されます
this.post_complete =関数(JSON)
{
this.fileSvr.perSvr = "100%"。
this.fileSvr.completeは真=。
$ .each(this.ui.btn、機能(I、N)
{
n.hide();
});
this.ui.process.css( "幅"、 "100%")。
this.ui.percent.text( "(100%)")。
this.ui.msg.text( "完全アップロード");
this.Manager.arrFilesComplete.push(この);
this.State = this.Config.state.Complete。
//アップロードリストから削除
this.Manager.RemoveQueuePost(this.fileSvr.id)。
//アップロードしたことがないリストを削除します
this.Manager.RemoveQueueWait(this.fileSvr.id)。
VAR PARAM = {MD5:this.fileSvr.md5、UID:this.uid、ID:this.fileSvr.id、時間:新しい日付()getTime()}。
$アヤックス({
タイプ: "GET"
、データ型: 'JSONP'
、JSONPは:JSONPから「コールバック」//コールバック関数名定義され、デフォルトのランダム関数名が自動的にjQueryのために生成されています
、URL:_this.Config [ "UrlComplete"]
、データ:PARAM
成功:関数(MSG)
{
_this.event.fileComplete(_this); //トリガイベント
_this.post_next()。
}
、エラー:関数(REQ、TXT、ERR){警告( "ファイル - サーバエラーに送信Completeメッセージ!" + Req.responseText);}
完全:関数(REQ、STA){REQ = NULL; }
});
}。
これは、ロジックを処理して第二の伝送MD5も、同じファイルサーバの存在は、ユーザーが再アップロードする必要がない場合が、ユーザー秒に通知を直接渡す必要があります
this.post_complete_quick =関数()
{
this.fileSvr.perSvr = "100%"。
this.fileSvr.completeは真=。
this.ui.btn.stop.hide();
this.ui.process.css( "幅"、 "100%")。
this.ui.percent.text( "(100%)")。
this.ui.msg.text(「同じファイルサーバの存在は、すぐに成功し、アップロードします。」);
this.Manager.arrFilesComplete.push(この);
this.State = this.Config.state.Complete。
//アップロードリストから削除
this.Manager.RemoveQueuePost(this.fileSvr.id)。
//アップロードしたことがないリストを削除します
this.Manager.RemoveQueueWait(this.fileSvr.id)。
//ファイルリストに追加します
this.post_next();
this.event.fileComplete(この); //トリガイベント
}。
ここでは、論理的な第二のパスを参照することができ、特に複雑な、非常に簡単ではありません。
そこフォーム=新しい()にformdat。
form.append( "ユーザ名"、 "zxj");
form.append( "アバター"、ファイル);
// VARフォーム=新しいいるFormData($( "#postForm")[0]);
$アヤックス({
URL: "$ {pageContext.request.contextPath} / UploadServlet"、
タイプ:「ポスト」、
データ:フォーム、
PROCESSDATA:偽、
contentType:偽、
成功:機能(データ){
console.log(データ)。
}
});
Javaの一部
論理ファイルの初期化、メインのコードは次のようです
FileInf fileSvr =新しいFileInf();
fileSvr.id = ID。
fileSvr.fdChild = falseは、
fileSvr.uid = Integer.parseInt(UID)。
fileSvr.nameLoc = PathTool.getName(pathLoc)。
fileSvr.pathLoc = pathLoc。
fileSvr.lenLoc = Long.parseLong(lenLoc)。
fileSvr.sizeLoc = sizeLoc。
= falseをfileSvr.deleted。
fileSvr.md5 = MD5;
fileSvr.nameSvr = fileSvr.nameLoc。
//すべての個々のファイルは、UUID /ファイルが格納されています
PathBuilderUuid PB =新しいPathBuilderUuid();
fileSvr.pathSvr = pb.genFile(fileSvr.uid、fileSvr)。
fileSvr.pathSvr = fileSvr.pathSvr.replace( "\\"、 "/")。
DBCONFIG CFG =新しいDBCONFIG();
DBFILE DB = cfg.db()。
FileInf fileExist =新しいFileInf();
ブールが存在= db.exist_file(MD5、fileExist)。
//同じデータベースファイルが既に存在し、そこにアップロードの進捗状況は、この情報を直接使用
(が存在&& fileExist.lenSvr> 1)場合
{
fileSvr.nameSvr = fileExist.nameSvr。
fileSvr.pathSvr = fileExist.pathSvr。
fileSvr.perSvr = fileExist.perSvr。
fileSvr.lenSvr = fileExist.lenSvr。
fileSvr.complete = fileExist.complete。
db.Add(fileSvr)。
//トリガイベント
up6_biz_event.file_create_same(fileSvr)。
} //このファイルは存在しません。
そうしないと
{
db.Add(fileSvr)。
//トリガイベント
up6_biz_event.file_create(fileSvr)。
FileBlockWriter FR =新しいFileBlockWriter();
fr.CreateFile(fileSvr.pathSvr、fileSvr.lenLoc)。
}
このロジックでは、ファイル・データ・ブロックを受信すると、我々は、ファイル・データ・ブロックを受けました。制御データは、デバッグを容易にするために最適化しました。あなたは監視ツールコントロールで提出されたデータを見ることができます。
ブールisMultipart = ServletFileUpload.isMultipartContent(リクエスト)。
FileItemFactory工場=新しいDiskFileItemFactory();
ServletFileUploadアップロード=新しいServletFileUpload(工場)。
リストファイル= NULL;
試します
{
ファイル= upload.parseRequest(リクエスト)。
}
キャッチ(FileUploadException電子)
{//ファイルのデータエラーを解析
out.printlnを( "読み取りファイルデータのエラー:" + e.toString());
リターン;
}
FileItem rangeFile = NULL;
//すべてアップロードされたファイルを取得します
反復子fileItr = files.iterator()。
すべてのファイルを処理する//ループ
しばらく(fileItr.hasNext())
{
//現在のファイルを取得します
rangeFile =(FileItem)fileItr.next();
もし(StringUtils.equals(rangeFile.getFieldName()、 "pathSvr"))
{
pathSvr = rangeFile.getString()。
pathSvr = PathTool.url_decode(pathSvr)。
}
}
ブール= falseを確認してください。
文字列MSG = "";
文字列md5Svr = "";
長いblockSizeSvr = rangeFile.getSize()。
(もし!StringUtils.isBlank(blockMd5))
{
md5Svr = Md5Tool.fileToMD5(rangeFile.getInputStream())。
}
検証= Integer.parseInt(のblockSize)== blockSizeSvr。
(もし!検証)
{
MSG = "ブロックサイズエラーsizeSvr:" + blockSizeSvr + "sizeLoc:" +のblockSize。
}
もし(検証&&!StringUtils.isBlank(blockMd5))
{
検証= md5Svr.equals(blockMd5)。
もし(検証!)MSG = "ブロックMD5エラー";
}
(検証)の場合
{
//ファイルを保存してブロックデータ
FileBlockWriter RES =新しいFileBlockWriter();
//最初のものだけを作成
IF(Integer.parseInt(blockIndex)== 1)res.CreateFile(pathSvr、Long.parseLong(lenLoc))。
res.write(Long.parseLong(blockOffset)、pathSvr、rangeFile)。
up6_biz_event.file_post_block(ID、Integer.parseInt(blockIndex))。
JSONObject O =新しいJSONObject()。
o.put( "MSG"、 "OK")。
o.put( "MD5"、md5Svr)。
o.put(、blockOffset「オフセット」); //オフセット位置をファイルブロックに基づいて
MSG = o.toString()。
}
rangeFile.delete();
out.write(MSG)。
注意:
Javaコードの1上部が直接使用することができ、書き込みのみ、画像パスをアップロードし、データを収集し、データベースを必要とすることができます
2.バイトストリームに上記のアップロードファイルを、実際には、また、他のストリームを使用することができ、下に読者自身のテストを改善する必要性
3.々BeanUtilsエンティティに対応するエンティティに割り当てられた属性を容易にするツールであります
4.アップロードファイルは、その後、request.getParameter(「」)取得パラメータではなく、直接解析リクエストに、各ファイルがファイルであるか否かを判定することにより、および、対応する動作を行う(ストリームファイルは読み取りを使用することができません非ファイル、一時的にマップに保存。)
バックエンドのコード・ロジックの大部分は、現在のMySQLやOracle、SQLをサポートし、同じです。データベースを構成する必要性を使用する前に、この記事を書くために私を指すことができます。http://blog.ncmem.com/wordpress/2019/08/12/java-http%E5%A4%A7%E6%96%87 %E4%BB%B6%E6
%96%AD%E7%82%B9%E7%BB%AD%E4%以下のBC%A0%E4%B8%8A%E4%BC%のA0 / ウェルカムグループに「374992201を議論します"