用Struts實現動態多檔案上傳功能

來源:互聯網
上載者:User

最近剛用了 Struts 實現了動態多檔案上傳功能, 現在做個存檔.
  
ActionForm部分: 
import org.apache.struts.action.ActionForm;<br />/**<br />* MyEclipse Struts<br />* @author eplang<br />* Creation date: 03-04-2008<br />*<br />* XDoclet definition:<br />* @struts.form name="uploadForm"<br />*/<br />public class UploadForm extends ActionForm {<br />private String title;<br />private String bodyText;<br />public String getBodyText() {<br /> return bodyText;<br />}<br />public void setBodyText(String bodyText) {<br /> this.bodyText = bodyText;<br />}<br />public String getTitle() {<br /> return title;<br />}<br />public void setTitle(String title) {<br /> this.title = title;<br />}<br />}  
  
Action 部分: 
  import java.io.File;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.util.Enumeration;<br />import java.util.Hashtable;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.upload.FormFile;<br />import com.eplang.form.UploadForm;<br />/**<br />* MyEclipse Struts<br />* Creation date: 03-04-2008<br />* @author eplang<br />*<br />* XDoclet definition:<br />* @struts.action path="/upload" name="uploadForm" input="/error.jsp" scope="request" validate="true"<br />* @struts.action-forward name="wancheng" path="/index.jsp"<br />*/<br />public class UploadAction extends Action {<br />public ActionForward execute(ActionMapping mapping, ActionForm form,<br /> HttpServletRequest request, HttpServletResponse response) {<br /> UploadForm uploadForm = (UploadForm) form; </p><p> try {<br /> //調用檔案上傳的方法.<br /> this.uploadFile(uploadForm);<br /> } catch (IOException ex) {<br /> /*<br /> *如在上傳的過程中,出現異常,將返回到錯誤頁面.<br /> *在這裡也可以做另一些操作.<br /> * 比如驗證一下該次失敗的操作中,<br /> * 附件列表中是否已經有檔案已經成功上傳到伺服器中,<br /> * 如果有的話,將其刪除.<br /> */<br /> ex.printStackTrace();<br /> return new ActionForward(mapping.getInput());<br /> } </p><p> return mapping.findForward("wancheng");<br />} </p><p>//上傳檔案方法.<br />private void uploadFile(UploadForm form) throws IOException {<br /> /*<br /> * 獲得提交的FormFile集合.<br /> * ActionForm.getMultipartRequestHandler().getFileElements();<br /> * 該方法可以獲得存放著所上傳的檔案的 HashTable 集合.<br /> */<br /> Hashtable uploadFiles = form.getMultipartRequestHandler().getFileElements();<br /> String newFileName = null; </p><p> /*<br /> * 為防止使用者禁用 JavaScript 來繞過用戶端驗證,<br /> * 可以在這兒做伺服器的驗證,<br /> * 比如驗證檔案格式是否合法(例 rar,jpg),大小是否合法等.<br /> */ </p><p> for (Enumeration keys = uploadFiles.keys();keys.hasMoreElements();) {<br /> /*<br /> *通過 for 迴圈,可以從上傳檔案的 hashTable 集合中,<br /> *以 key 為鍵,取出存放的值,並強轉為 FormFile 類型.<br /> */<br /> FormFile formFile = (FormFile) uploadFiles.get(keys.nextElement());<br /> String oldFileName = formFile.getFileName();<br /> //判斷擷取的檔案名稱是否為空白,是則結束本次迴圈.<br /> if (oldFileName == null || oldFileName.equals("") == true) {<br /> continue;<br /> } </p><p> //獲得檔案尾碼名.<br /> String postfix = this.getPostfix(oldFileName);<br /> //獲得隨機的新檔案名稱.<br /> newFileName = this.getRandomFileName(oldFileName); </p><p> //獲得輸入資料流.<br /> InputStream is = formFile.getInputStream();<br /> File newFile = null; </p><p> /*<br /> * 驗證檔案的格式.<br /> * 並為不同檔案格式建立不同 URL 的 File 對象.<br /> */<br /> if (this.checkFileType(postfix) == 1) {<br /> newFile = new File(this.getServlet().getServletConfig().getServletContext().getRealPath("/Upload/Images") + "/" + newFileName);<br /> } else if (this.checkFileType(postfix) == 2) {<br /> newFile = new File(this.getServlet().getServletConfig().getServletContext().getRealPath("/Upload/Files") + "/" + newFileName);<br /> } </p><p> //建立目標檔案.<br /> newFile.createNewFile(); </p><p> //建立輸出資料流.<br /> OutputStream os = new FileOutputStream(newFile);<br /> //建立位元組緩衝區.<br /> byte bytes[] = new byte[1024 * 8]; </p><p> //從輸入資料流中讀取,並寫入輸出資料流中.<br /> for (int index = 0; (index = is.read(bytes)) != -1;) {<br /> os.write(bytes,0,index);<br /> } </p><p> //清空寫緩衝.<br /> os.flush();<br /> //銷毀 formFile.<br /> formFile.destroy();<br /> //關閉流.<br /> os.close();<br /> is.close(); </p><p> //調用內容文本替換方法,將原本的偽UBB代碼替換成真正的UBB代碼<br /> form.setBodyText(replace(oldFileName,newFileName,form.getBodyText()));<br /> }<br />} </p><p>//獲得檔案尾碼名.<br />private String getPostfix(String fileName) {<br /> return fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();<br />} </p><p>//驗證檔案類型.<br />private int checkFileType(String postfixName) {<br /> postfixName = postfixName.toUpperCase();<br /> if(postfixName.equals("JPG") || postfixName.equals("GIF") || postfixName.equals("PNG") || postfixName.equals("BMP")){<br /> return 1;<br /> } else if (postfixName.equals("RAR") || postfixName.equals("ZIP") || postfixName.equals("TXT")) {<br /> return 2;<br /> } else {<br /> return 0;<br /> }<br />} </p><p>//替換髮布內容中的附件標籤.<br />private String replace(String oldFileName,String newFileName,String bodyText) {<br /> //獲得檔案尾碼名.<br /> String postfix = this.getPostfix(oldFileName);<br /> String oldUBB = null;<br /> String newUBB = null; </p><p> /*<br /> * 根據檔案尾碼名來為其建立不同的 UBB代碼.<br /> * 由於 [ 號在 String.replaceAll() 方法中的 arg1 參數中,<br /> * 會被當成Regex的一部分,所以要通過 // 將其轉義成一個真正意義上的 [ 號<br /> */<br /> if(this.checkFileType(postfix) == 1){<br /> oldUBB = "[url=file://%5Blocal:image//]//[local:image//[/url]]" + oldFileName + "[url=file://%5B/local:image//]//[/local:image//[/url]]";<br /> newUBB = "[img]" + "Upload/Images/" + newFileName + "[/img]"; </p><p> bodyText = bodyText.replaceAll(oldUBB,newUBB);<br /> } else if (this.checkFileType(postfix) == 2) {<br /> oldUBB = "[url=file://%5Blocal:url//]//[local:url//[/url]]"+ oldFileName +"[url=file://%5B/local:url//]//[/local:url//[/url]]";<br /> newUBB = "[url=" + "Upload/Files/" + newFileName + "]"+oldFileName+"[/url]"; </p><p> bodyText = bodyText.replaceAll(oldUBB,newUBB);<br /> } </p><p> return bodyText;<br />} </p><p>//獲得隨機檔案名稱.<br />public String getRandomFileName(String fileName) {<br /> String postfix = this.getPostfix(fileName);<br /> String newFileName = null; </p><p> //通過拼湊的方式,以系統的當前納秒值為鍵,獲得隨機檔案名稱.<br /> newFileName = fileName.substring(0,fileName.lastIndexOf(".")) +<br /> String.valueOf(System.nanoTime()) + "." + postfix; </p><p> return newFileName;<br />}<br />}  

  
JSP 部分: 
  
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><br /><%@ taglib http://jakarta.apache.org/struts/tags-bean">http://jakarta.apache.org/struts/tags-bean" prefix="bean"%><br /><%@ taglib http://jakarta.apache.org/struts/tags-html">http://jakarta.apache.org/struts/tags-html" prefix="html"%> </p><p><html><br /><head><br /> <title>JSP for UploadForm form</title><br /> <mce:script type="text/javascript"><!--</p><p> var a =1; </p><p> function insertToBody(filename) {<br /> //獲得檔案類型.<br /> var postfix=filename.substring(filename.lastIndexOf(".")+1).toUpperCase();<br /> //獲得文字框對象.<br /> var bodyText = document.getElementById("bodyText");<br /> if(postfix == "JPG" || postfix == "GIF" || postfix == "PNG" || postfix == "BMP"){<br /> bodyText.value += bodyText.value+"[local:image]"+filename+"[/local:image]";<br /> } else if (postfix == "RAR" || postfix == "ZIP" || postfix == "TXT") {<br /> bodyText.value += bodyText.value+"[local:url]"+filename+"[/local:url]";<br /> }<br /> } </p><p> function deleteToBody(obj) {<br /> //獲得傳過來的對象處於表格的下標.<br /> var rowIndex = obj.parentElement.parentElement.rowIndex;<br /> //擷取要刪除的表格.<br /> var optionTable = document.getElementById("optionTable");<br /> var filesTable = document.getElementById("filesTable");<br /> //刪除選中的行.<br /> optionTable.deleteRow(rowIndex);<br /> filesTable.deleteRow(rowIndex); </p><p> } </p><p> function insertFileHtml(accessory) {<br /> var postfix = accessory.value.substring(accessory.value.lastIndexOf(".")+1).toUpperCase(); </p><p> //做檔案尾碼名的基本用戶端驗證.<br /> if(postfix == "JPG" || postfix == "GIF" || postfix == "PNG" || postfix == "BMP"<br /> || postfix == "RAR" || postfix == "ZIP" || postfix == "TXT"){<br /> }else{<br /> alert("檔案類型不支援.只支援JPG,GIF,PNG,BMP,RAR,ZIP,TXT");<br /> return;<br /> } </p><p> a = a + 1;<br /> //獲得附件表格對象.<br /> var fileTable = document.getElementById("filesTable");<br /> //獲得表格的行集合對象.<br /> var rows = fileTable.rows;<br /> //為表格添加新的一行至末尾處.<br /> var newRow = fileTable.insertRow(rows.length);<br /> //獲得新行的列集合對象.<br /> var cells = newRow.cells;<br /> //為新行設定列內容.<br /> var newCell = rows(newRow.rowIndex).insertCell(0);<br /> newCell.innerHTML = "附件: ";<br /> newCell = rows(newRow.rowIndex).insertCell(1);<br /> newCell.innerHTML = "<input type = 'file' name = 'uploadFile"<br /> + a + "' onchange='insertFileHtml(this);'/>"; </p><p> //隱藏上一行.<br /> var oldRow = rows(rows.length - 2);<br /> oldRow.style.display = "none"; </p><p> //調用附件動作表格的新增操作.<br /> insertOptionHtml(accessory);<br /> } </p><p> function insertOptionHtml(accessory) {<br /> var accessoryName = accessory.value.substring(accessory.value.lastIndexOf("//") + 1);<br /> //獲得附件動作表格對象.<br /> var fileTable = document.getElementById("optionTable");<br /> //獲得表格的行集合對象.<br /> var rows = fileTable.rows;<br /> //為表格添加新的一行至末尾處.<br /> var newRow = fileTable.insertRow(rows.length);<br /> //獲得新行的列集合對象.<br /> var cells = newRow.cells;<br /> //為新行設定列內容.<br /> var newCell = rows(newRow.rowIndex).insertCell(0);<br /> newCell.innerHTML = accessoryName;<br /> newCell = rows(newRow.rowIndex).insertCell(1);<br /> newCell.innerHTML = "<a href="#" mce_href="#" onclick='insertToBody(/""+accessoryName+"/");'>插入</a>&nbsp;&nbsp;<a href="#" mce_href="#" onclick='deleteToBody(this);'>刪除</a>";<br /> } </p><p>// --></mce:script><br /></head><br /><body> </p><p> <!-- 注意 form 表單元素的 enctype 屬性的設定,<br /> 只有設定了該屬性,表單提交之時才會將 File 元素所選定的檔案當成表單的一部分進行提交. --> </p><p> <html:form action="/upload" enctype="multipart/form-data" method="post"><br /> <table><br /> <tr><br /> <td>標題: </td><br /> <td><html:text property="title" /></td><br /> </tr><br /> <tr><br /> <td>內容: </td><br /> <td><html:textarea property="bodyText" /></td><br /> </tr><br /> <tr><br /> <td colspan="2"><br /> <table id="optionTable"><br /> </table><br /> </td><br /> </tr><br /> <tr><br /> <td colspan="2"><br /> <table id="filesTable"><br /> <tr><br /> <td colspan="2"><br /> <input name="uploadFile" type="file" onchange="insertFileHtml(this);"/><br /> </td><br /> </tr><br /> </table><br /> </td><br /> </tr><br /> </table><br /> <html:submit/><html:cancel/><br /> </html:form><br /></body><br /></html> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.