環(huán)境準(zhǔn)備
公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、商城建設(shè),微信平臺(tái)小程序開(kāi)發(fā),軟件按需開(kāi)發(fā)網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
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目錄下。
開(kāi)發(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=“開(kāi)始上傳”//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é)果見(jiàn)圖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”);
//開(kāi)始讀取上傳信息
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ì)頻繁使用硬盤作為緩沖以致?tīng)奚阅堋R虼?,設(shè)置該值時(shí)要根據(jù)用戶上傳文件大小分布情況來(lái)設(shè)定。例如大部分文件大小集中在100KB左右,則可以使用100KB作為該參數(shù)的值,當(dāng)然了再大就不合適了。使用commons-fileupload來(lái)處理HTTP文件上傳的功能模塊很小,但是值得研究的東西很多。
我有一段上傳圖片的代碼,并且可以根據(jù)實(shí)際,按月或按天等,生成存放圖片的文件夾
首先在JSP上放一個(gè)FILE的標(biāo)簽這些我都不說(shuō)了,你也一定明白,我直接把處理過(guò)程給你發(fā)過(guò)去
我把其中存到數(shù)據(jù)庫(kù)中的內(nèi)容刪除了,你改一下就能用
/**
*
* 上傳圖片
* @param servlet
* @param request
* @param response
* @return
* @throws Exception
*/
//這里我是同步上傳的,你隨意
public synchronized String importPic(HttpServlet servlet, HttpServletRequest request,HttpServletResponse response) throws Exception {
SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMM");
Date nowtime=new Date();
String formatnowtime=formatDate.format(nowtime);
File root = new File(request.getRealPath("/")+"uploadfile/images/"+formatnowtime+"/"); //應(yīng)保證在根目錄中有此目錄的存在 如果沒(méi)有,下面則上創(chuàng)建新的文件夾
if(!root.isDirectory())
{
System.out.println("創(chuàng)建新文件夾成功"+formatnowtime);
root.mkdir();
}
int returnflag = 0;
SmartUpload mySmartUpload =new SmartUpload();
int file_size_max=1024000;
String ext="";
String url="uploadfile/images/"+formatnowtime+"/";
// 只允許上載此類文件
try{
// 初始化
mySmartUpload.initialize(servlet.getServletConfig(),request,response);
mySmartUpload.setAllowedFilesList("jpg,gif,bmp,jpeg,png,JPG");
// 上載文件
mySmartUpload.upload();
} catch (Exception e){
response.sendRedirect()//返回頁(yè)面
}
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);
if (myFile.isMissing()){ //沒(méi)有選擇圖片做提示!
returnflag = 3;
}else{
String myFileName=myFile.getFileName(); //取得上載的文件的文件名
ext= myFile.getFileExt(); //取得后綴名
if(ext.equals("jpg")||ext.equals("gif")||ext.equals("bmp")||ext.equals("jpeg")||ext.equals("png")||ext.equals("JPG")){ //jpeg,png不能上傳!)
int file_size=myFile.getSize(); //取得文件的大小
String saveurl="";
if(file_sizefile_size_max){
try{
//我上面說(shuō)到,把操作數(shù)據(jù)庫(kù)的代友刪除了,這里就應(yīng)該是判斷,你的圖片是不是已經(jīng)存在了,存在要怎么處理,不存在要怎么處了,就是你的事了 }
//更改文件名,取得當(dāng)前上傳時(shí)間的毫秒數(shù)值
Calendar calendar = Calendar.getInstance();
//String filename = String.valueOf(calendar.getTimeInMillis());
String did = contractBean.getMaxSeq("MULTIMEDIA_SEQ");
String filename = did;
String flag = "0";
String path = request.getRealPath("/")+url;
String ename = myFile.getFileExt();
//.toLowerCase()轉(zhuǎn)換大小寫(xiě)
saveurl=request.getRealPath("/")+url;
saveurl+=filename+"."+ext; //保存路徑
myFile.saveAs(saveurl,mySmartUpload.SAVE_PHYSICAL);
//將圖片信息插入到數(shù)據(jù)庫(kù)中
// ------上傳完成,開(kāi)始生成縮略圖-----
java.io.File file = new java.io.File(saveurl); //讀入剛才上傳的文件
String newurl=request.getRealPath("/")+url+filename+"_min."+ext; //新的縮略圖保存地址
Image src = javax.imageio.ImageIO.read(file); //構(gòu)造Image對(duì)象
float tagsize=200;
int old_w=src.getWidth(null);
int old_h=src.getHeight(null);
int new_w=0;
int new_h=0;
int tempsize;
float tempdouble;
if(old_wold_h){
tempdouble=old_w/tagsize;
}else{
tempdouble=old_h/tagsize;
}
// new_w=Math.round(old_w/tempdouble);
// new_h=Math.round(old_h/tempdouble);//計(jì)算新圖長(zhǎng)寬
new_w=150;
new_h=110;//計(jì)算新圖長(zhǎng)寬
BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //繪制縮小后的圖
FileOutputStream newimage=new FileOutputStream(newurl); //輸出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
encoder.encode(tag); //近JPEG編碼
newimage.close();
returnflag = 1;
}else{
returnflag = 0;
System.out.println("('上傳文件大小不能超過(guò)"+(file_size_max/1000)+"K');");
}
}else{
returnflag = 2;
}
}
response.sendRedirect();
return "11";
}
你說(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..
}
分給偶吧。。
^
^!