很簡(jiǎn)單。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)閔行免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
可以手寫IO讀寫(有點(diǎn)麻煩)。
怕麻煩的話使用FileUpload組件 在servlet里doPost嵌入一下代碼
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
//設(shè)置保存上傳文件的目錄
String uploadDir =getServletContext().getRealPath("/up");
System.out.println(uploadDir);
if (uploadDir == null)
{
out.println("無法訪問存儲(chǔ)目錄!");
return;
}
//根據(jù)路徑創(chuàng)建一個(gè)文件
File fUploadDir = new File(uploadDir);
if(!fUploadDir.exists()){
if(!fUploadDir.mkdir())//如果UP目錄不存在 創(chuàng)建一個(gè) 不能創(chuàng)建輸出...
{
out.println("無法創(chuàng)建存儲(chǔ)目錄!");
return;
}
}
if (!DiskFileUpload.isMultipartContent(request))
{
out.println("只能處理multipart/form-data類型的數(shù)據(jù)!");
return ;
}
DiskFileUpload fu = new DiskFileUpload();
//最多上傳200M數(shù)據(jù)
fu.setSizeMax(1024 * 1024 * 200);
//超過1M的字段數(shù)據(jù)采用臨時(shí)文件緩存
fu.setSizeThreshold(1024 * 1024);
//采用默認(rèn)的臨時(shí)文件存儲(chǔ)位置
//fu.setRepositoryPath(...);
//設(shè)置上傳的普通字段的名稱和文件字段的文件名所采用的字符集編碼
fu.setHeaderEncoding("gb2312");
//得到所有表單字段對(duì)象的集合
List fileItems = null;
try
{
fileItems = fu.parseRequest(request);//解析request對(duì)象中上傳的文件
}
catch (FileUploadException e)
{
out.println("解析數(shù)據(jù)時(shí)出現(xiàn)如下問題:");
e.printStackTrace(out);
return;
}
//處理每個(gè)表單字段
Iterator i = fileItems.iterator();
while (i.hasNext())
{
FileItem fi = (FileItem) i.next();
if (fi.isFormField()){
String content = fi.getString("GB2312");
String fieldName = fi.getFieldName();
request.setAttribute(fieldName,content);
}else{
try
{
String pathSrc = fi.getName();
if(pathSrc.trim().equals("")){
continue;
}
int start = pathSrc.lastIndexOf('\\');
String fileName = pathSrc.substring(start + 1);
File pathDest = new File(uploadDir, fileName);
fi.write(pathDest);
String fieldName = fi.getFieldName();
request.setAttribute(fieldName, fileName);
}catch (Exception e){
out.println("存儲(chǔ)文件時(shí)出現(xiàn)如下問題:");
e.printStackTrace(out);
return;
}
finally //總是立即刪除保存表單字段內(nèi)容的臨時(shí)文件
{
fi.delete();
}
}
}
注意 JSP頁面的form要加enctype="multipart/form-data" 屬性, 提交的時(shí)候要向服務(wù)器說明一下 此頁面包含文件。
如果 還是麻煩,干脆使用Struts 的上傳組件 他對(duì)FileUpload又做了封裝,使用起來更傻瓜化,很容易掌握。
-----------------------------
以上回答,如有不明白可以聯(lián)系我。
使用一些已有的組件幫助我們實(shí)現(xiàn)這種上傳功能。常用的上傳組件:Apache的CommonsFileUploadJavaZoom的UploadBeanjspSmartUpload以下,以FileUpload為例講解1、在jsp端要注意enctype="multipart/form-data"然后只需要放置一個(gè)file控件,并執(zhí)行submit操作即可2、web端核心代碼如下:publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{request.setCharacterEncoding("UTF-8");DiskFileItemFactoryfactory=newDiskFileItemFactory();ServletFileUploadupload=newServletFileUpload(factory);try{Listitems=upload.parseRequest(request);Iteratoritr=items.iterator();while(itr.hasNext()){FileItemitem=(FileItem)itr.next();if(item.isFormField()){System.out.println("表單參數(shù)名:"+item.getFieldName()+",表單參數(shù)值:"+item.getString("UTF-8"));}else{if(item.getName()!=null!item.getName().equals("")){System.out.println("上傳文件的大小:"+item.getSize());System.out.println("上傳文件的類型:"+item.getContentType());System.out.println("上傳文件的名稱:"+item.getName());FiletempFile=newFile(item.getName());Filefile=newFile(sc.getRealPath("/")+savePath,tempFile.getName());item.write(file);request.setAttribute("upload.message","上傳文件成功!");}else{request.setAttribute("upload.message","沒有選擇上傳文件!");}}}}catch(FileUploadExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();request.setAttribute("upload.message","上傳文件失敗!");}request.getRequestDispatcher("/uploadResult.jsp").forward(request,response);}
其實(shí)就是上傳文件,方便點(diǎn)的下載個(gè)fileupload 插件,將文件轉(zhuǎn)換成流,然后再寫出到指定的路徑,將存儲(chǔ)路徑存儲(chǔ)在數(shù)據(jù)庫中。再好點(diǎn)的,可以將這個(gè)頭像文件做一次壓縮處理,原圖一個(gè)路徑,壓縮圖一個(gè)路徑。壓縮圖路徑展示小圖,原圖路徑展示原圖。一般這個(gè)路徑都是基于工程的相對(duì)路徑。
使用MyEclipse實(shí)現(xiàn)上傳時(shí),所選擇的請(qǐng)求必須是POST請(qǐng)求,如下jsp:
body
h3 align="left"
上傳頭像
/h3
br
form action="UploadServlet" method="post"
enctype="multipart/form-data"
姓名:
input type="text" name="username"
br
頭像:
input type="file" name="photo"
br
input type="submit" value="上傳"
/form
/body
其次是需要添加上傳的jar包c(diǎn)ommons-fileupload-1.3.1.jar、commons-io-2.4.jar
最后需要在Servlet中進(jìn)行邏輯處理:
// 1、創(chuàng)建FileUpload對(duì)象
// (1)創(chuàng)建工廠
FileItemFactory factory = new DiskFileItemFactory();
// (2)創(chuàng)建FileUpload對(duì)象
ServletFileUpload upload = new ServletFileUpload(factory);
// (3)把請(qǐng)求中的所有數(shù)據(jù)轉(zhuǎn)換成FileItem對(duì)象
try {
ListFileItem list = upload.parseRequest(request);
// (4)判斷是文件域還是表單域,如果是表單域,則返回true
for (int i = 0; i list.size(); i++) {
if (list.get(i).isFormField()) {
// (5)獲取input標(biāo)簽中name屬性的值
if (list.get(i).getFieldName().equals("username")) {
// 輸出提取到的具體的值
System.out.println("用戶姓名為:"
+ list.get(i).getString("utf-8"));
}
} else {
// 輸出上傳的路徑
System.out.println("upload的路徑:"
+ getServletContext().getRealPath("upload"));
// 獲取到上傳的文件的名字
File file = new File(getServletContext().getRealPath(
"upload"),
list.get(i)
.getName()
.substring(
list.get(i).getName()
.lastIndexOf("\\") + 1));
list.get(i).write(file);
}
}