十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
用struts也可以實(shí)現(xiàn) 多文件上傳
我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、彰武ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的彰武網(wǎng)站制作公司
下面是我寫的代碼,作為參考!
/*文件目錄*/
public static String [] fileArray={
"logo.png",
"index.swf",
"OEMInfo.txt",
"favicon.ico"};
/**
* @author Caoshun
* @see 接收并保存文件
* */
public static void receiveAndSaveAllFileByPath(ActionForm form,String rootPath1,String rootPath2){
String fileName="";
//獲取表單中的文件資源
HashtableObject, Object files = form.getMultipartRequestHandler().getFileElements();
//遍歷文件,并且循環(huán)保存
//當(dāng)前處理文件序號(hào)
int file_num=1;
for (EnumerationObject e = files.keys(); e.hasMoreElements();) {
/*根據(jù)處理的當(dāng)前文件下標(biāo),確定文件名*/
fileName=fileArray[file_num-1];
FormFile file = (FormFile) files.get((String) e.nextElement());
if (file != null file.getFileSize() 0) {
try {
//使用formfile.getInputStream()來(lái)獲取一個(gè)文件的輸入流進(jìn)行保存。
//文件名
//String fileName = file.getFileName();
//System.out.println("debug in AddEnterpriceAction.java on line 152 fileName is : "+fileName);
//文件大小
//int fileSize = file.getFileSize();
//文件流
InputStream is = file.getInputStream();
//將輸入流保存到文件
//String rootPath = this.servlet.getServletContext().getRealPath("files");
//往cn中寫入
File rf = new File(rootPath1);
FileOutputStream fos = null;
fos = new FileOutputStream(new File(rf, fileName));
byte[] b = new byte[10240];
int real = 0;
real = is.read(b);
while (real 0) {
fos.write(b, 0, real);
real = is.read(b);
}
//往en中寫入
File rf2 = new File(rootPath2);
InputStream is2 = file.getInputStream();
FileOutputStream fos2 = null;
fos2 = new FileOutputStream(new File(rf2, fileName));
byte[] b2 = new byte[10240];
int real2 = 0;
real2 = is2.read(b2);
while (real2 0) {
fos2.write(b2, 0, real2);
real2 = is2.read(b2);
}
//關(guān)閉文件流
fos.close();
is.close();
fos2.close();
is2.close();
} catch (RuntimeException e1) {
e1.printStackTrace();
} catch (Exception ee) {
ee.printStackTrace();
}
file.destroy();
}
file_num++;
}
}
環(huán)境準(zhǔn)備
1. 下載并安裝Tomcat(已經(jīng)有很多關(guān)于Tomcat安裝以及使用的文章,在這里不再介紹);
2. 下載File upload的jar包c(diǎn)ommons-fileupload-1.0-beta-1.jar,并將該文件拷貝到{$TOMCAT}/common/lib目錄下(其中{$TOMCAT}為Tomcat的安裝目錄);
3. 由于Fileupload子項(xiàng)目同時(shí)要用到另外一個(gè)項(xiàng)目commons-Beanutils,所以必須下載Beanutils,并將解壓后的文件commons-beanutils.jar拷貝到{$TOMCAT}/common/lib目錄下。
開發(fā)文件上傳頁(yè)面
文件上傳的界面如圖1所示。為了增加效率我們?cè)O(shè)計(jì)了三個(gè)文件域,同時(shí)上傳三個(gè)文件。
圖1 文件上傳界面
頁(yè)面的HTML代碼如下:
html
head
title文件上傳演示/title
/head
body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”
center
h1文件上傳演示/h1
form name=“uploadform”method=“POST” action=“save.jsp”ENCTYPE=“multipart/form-data”
table border=“1”width=“450”cellpadding=“4” cellspacing=“2”bordercolor=“#9BD7FF”
trtd width=“100%”colspan=“2”
文件1:input name=“file1”size=“40”type=“file”
/td/tr
trtd width=“100%”colspan=“2”
文件2:input name=“file2”size=“40”type=“file”
/td/tr
trtd width=“100%”colspan=“2”
文件3:input name=“file3”size=“40”type=“file”
/td/tr
/table
br/br/
table
trtd align=“center”input name=“upload” type=“submit”value=“開始上傳”//td/tr
/table
/form
/center
/body
/html
代碼中要特別注意的是黑體處。必須保證表單的ENCTYPE屬性值為multipart/form-data,這樣瀏覽器才能正確執(zhí)行上傳文件的操作。
處理上傳文件信息
由于本文主要是講述如何使用Commons-fileupload,所以為了便于修改、調(diào)試,上傳文件的保存使用一個(gè)JSP文件來(lái)進(jìn)行處理。我們將瀏覽器上傳來(lái)的所有文件保存在一個(gè)指定目錄下并在頁(yè)面上顯示所有上傳文件的詳細(xì)信息。保存頁(yè)面處理結(jié)果見圖2所示。
圖2 保存頁(yè)面
下面來(lái)看看save.jsp的代碼:
%
/**
* 演示文件上傳的處理
* @author a href=“mailto:winter.lau@163.com”Winter Lau/a
* @version $Id: save.jsp,v 1.00 2003/03/01 10:10:15
*/
%
%@ page language=“java”contentType=“text/html;charset=GBK”%
%@ page import=“java.util.*”%
%@ page import=“org.apache.commons.fileupload.*”%
html
head
title保存上傳文件/title
/head
%
String msg = “”;
FileUpload fu = new FileUpload();
// 設(shè)置允許用戶上傳文件大小,單位:字節(jié)
fu.setSizeMax(10000000);
// maximum size that will be stored in memory?
// 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)
fu.setSizeThreshold(4096);
// 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄
fu.setRepositoryPath(“C:\\TEMP”);
//開始讀取上傳信息
List fileItems = fu.parseRequest(request);
%
body bgcolor=“#FFFFFF”text=“#000000” leftmargin=“0”topmargin=“40”marginwidth=“0” marginheight=“0”
font size=“6”color=“blue”文件列表:/font
center
table cellpadding=0 cellspacing=1 border=1 width=“100%”
tr
td bgcolor=“#008080”文件名/td
td bgcolor=“#008080”大小/td
/tr
%
// 依次處理每個(gè)上傳的文件
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
//忽略其他不是文件域的所有表單信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if((name==null||name.equals(“”)) size==0)
continue;
%
tr
td%=item.getName()%/td
td%=item.getSize()%/td
/tr
%
//保存上傳的文件到指定的目錄
name = name.replace(‘:’,‘_’);
name = name.replace(‘\\’,‘_’);
item.write(“F:\\”+ name);
}
}
%
/table
br/br/
a href=“upload.html”返回上傳頁(yè)面/a
/center
/body
/html
在這個(gè)文件中需要注意的是FileUpload對(duì)象的一些參數(shù)值的意義,如下面代碼所示的三個(gè)參數(shù)sizeMax、sizeThreshold、repositoryPath:
FileUpload fu = new FileUpload();
// 設(shè)置允許用戶上傳文件大小,單位:字節(jié)
fu.setSizeMax(10000000);
// maximum size that will be stored in memory?
// 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)
fu.setSizeThreshold(4096);
// 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄
fu.setRepositoryPath(“C:\\TEMP”);
這3個(gè)參數(shù)的意義分別為:
SizeMax 用來(lái)設(shè)置上傳文件大小的最大值,一旦用戶上傳的文件大小超過(guò)該值時(shí)將會(huì)拋出一個(gè)FileUploadException異常,提示文件太大;
SizeThreshold 設(shè)置內(nèi)存中緩沖區(qū)的大小,一旦文件的大小超過(guò)該值的時(shí)候,程序會(huì)自動(dòng)將其它數(shù)據(jù)存放在repositoryPath指定的目錄下作為緩沖。合理設(shè)置該參數(shù)的值可以保證服務(wù)器穩(wěn)定高效的運(yùn)行;
RepositoryPath 指定緩沖區(qū)目錄。
使用注意事項(xiàng)
從實(shí)際應(yīng)用的結(jié)果來(lái)看該模塊能夠穩(wěn)定高效的工作。其中參數(shù)SizeThreshold的值至關(guān)重要,設(shè)置太大會(huì)占用過(guò)多的內(nèi)存,設(shè)置太小會(huì)頻繁使用硬盤作為緩沖以致犧牲性能。因此,設(shè)置該值時(shí)要根據(jù)用戶上傳文件大小分布情況來(lái)設(shè)定。例如大部分文件大小集中在100KB左右,則可以使用100KB作為該參數(shù)的值,當(dāng)然了再大就不合適了。使用commons-fileupload來(lái)處理HTTP文件上傳的功能模塊很小,但是值得研究的東西很多。
你說(shuō)的這個(gè)問(wèn)題,其實(shí)是表的設(shè)計(jì)問(wèn)題。
只要在t_b中,設(shè)計(jì)列為3列即可。
id
,
t_a_id
,
picture
添加多個(gè)圖片,不過(guò)是sql、語(yǔ)句。
最簡(jiǎn)單的辦法,是利用for()循環(huán),如:
for(int
i
=
0;i圖片數(shù);i++){
//你的sql操作語(yǔ)句如。
//insert
圖片i
into
t_b..
}
分給偶吧。。
^
^!