javaweb上傳下載實(shí)例完整版解析(上)
在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的文件上傳和下載功能的實(shí)現(xiàn),重點(diǎn)在文件上傳
對(duì)于文件上傳,瀏覽器在上傳的過程中是將文件以流的形式提交到服務(wù)器端的,如果直接使用Servlet獲取上傳文件的輸入流然后再解析里面的請(qǐng)求參數(shù)是比較麻煩,所以一般選擇采用apache的開源工具common-fileupload這個(gè)文件上傳組件。這個(gè)common-fileupload上傳組件的jar包可以去apache官網(wǎng)上面下載,也可以在struts的lib文件夾下面找到,struts上傳的功能就是基于這個(gè)實(shí)現(xiàn)的。common-fileupload是依賴于common-io這個(gè)包的,所以還需要下載這個(gè)包。
一、開發(fā)環(huán)境搭建
創(chuàng)建一個(gè)FileUploadAndDownLoad項(xiàng)目,加入Apache的commons-fileupload文件上傳組件的相關(guān)Jar包,如下圖所示:

二、實(shí)現(xiàn)文件上傳
2.1 文件上傳頁面
upload.html代碼如下
<div>
<h5>文件上傳</h5><hr/>
<form id="file_upload_id" name="file_upload_name" >
<div><input type="file" name="file_upload"/></div>
<div onclick = "upload()"><input type="button" value="上傳" /></div><br>
<div>
<span id="typeValue"></span>
<input id="type" type="hidden" name="input_type">
</div>
<div>
<span id="sizeValue"></span>
<input id="size" type="hidden" name="input_size">
</div>
</form>
</div>
<script>
$(function(){
a();
});
function a(){
var size=1024 * 1024 * 50;
var type=
"gif,jpg,jpeg,png,bmp,swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb,doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2,jsp";
$("#type").val(type);//利用input傳值到后臺(tái)
$("#typeValue").html("文件格式限制為:"+type);//顯示
$("#size").val(size);
$("#sizeValue").html("文件大小限制為:"+size);
}
function upload(){
var formdata = new FormData($('#file_upload_id')[0]);
$.ajax({
url: 'cloud/load/upload',
type: 'POST',
data: formdata,
dataType:'JSON',
cache: false,
processData: false,
contentType: false ,
success : function(date){
alert("success");
},
error : function(e){
alert("error");
}
});
}
</script>
2.2 controller
package com.cloud.web.controller;
import java.io.IOException;
import java.util.HashMap;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.cloud.web.service.FileLoadService;
@Controller
@RequestMapping("/load")
public class LoadController {
@Resource
public FileLoadService fileLoadService;
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public HashMap<String,Object> upload(@RequestParam("file_upload") MultipartFile file,@RequestParam("input_type") String extName,@RequestParam("input_size") String size, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws ServletException, IOException {
HashMap<String,Object> map = new HashMap<String,Object>();
request.setCharacterEncoding("UTF-8");// 解決上傳的中文文件亂碼問題
response.setContentType("text/html;charset=UTF-8");
long fileSizeMax=Long.parseLong(size);
String mes =fileLoadService.doUpload(file,request, extName, fileSizeMax);
map.put("mes", mes);
return map;
}
}
2.3 service
FileLoadServiceImpl.java程序如下:
package com.cloud.web.service.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.cloud.web.service.FileLoadService;
@Service
public class FileLoadServiceImpl implements FileLoadService{
@Override
public String doUpload(MultipartFile file, HttpServletRequest request, String extName, long fileSizeMax) throws ServletException, IOException{
// 存放路徑
String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/")+"/upload/test/";
String msg="";//返回消息
try {
String fileName = file.getOriginalFilename();// 獲取上傳的文件的文件名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();// 獲取上傳文件的擴(kuò)展名
if (fileName != null) {
System.out.println("上傳的文件的擴(kuò)展名是:" + fileExt);
if(!extName.contains(fileExt)){
System.out.println("上傳文件擴(kuò)展名是不允許的擴(kuò)展名:" + fileExt);
msg = msg + "文件:" + fileName + ",上傳文件擴(kuò)展名是不允許的擴(kuò)展";
}else if(file.getSize() > fileSizeMax){
// 如果需要限制上傳的文件大小,不超過最大限制
System.out.println("上傳文件大?。? + file.getSize());
msg = msg + "文件:" + fileName + ",上傳文件大小超過限制大小";
}else{
Date now = new Date();
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String str = df.format(now);
String nFileName=str+"_"+fileName;
// 生成一個(gè)子目錄
String childDirectory = genChildDirectory(realPath);
File storeDirectory = new File(realPath + File.separator + childDirectory);
//如果目錄不存在,就創(chuàng)建一個(gè)
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();
}
// 獲取item中的上傳文件的輸入流
InputStream is = file.getInputStream();
//創(chuàng)建一個(gè)文件輸出流
FileOutputStream out = new FileOutputStream(storeDirectory + "\\" + nFileName);
//創(chuàng)建一個(gè)緩沖區(qū)
byte buffer[] = new byte[1024];
//判斷輸入流中的數(shù)據(jù)是否已經(jīng)讀完的標(biāo)致
int len = 0;
while((len = is.read(buffer)) > 0){
out.write(buffer, 0, len);
}
out.close();//關(guān)閉輸出流
is.close(); //關(guān)閉輸入流
msg="file:" + fileName + ",success";
}
}
} catch (Exception e) {
e.printStackTrace();
}
return msg;
}
// 按照時(shí)間創(chuàng)建分目錄 放置一個(gè)文件夾下面的文件過多
@Override
public String genChildDirectory(String realPath) {
Date now = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String str = df.format(now);
File file = new File(realPath, str);
if (!file.exists()) {
file.mkdirs();
}
return str;
}
}
界面展示:

文件上傳位置:

以上文件上傳功能完成!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析
這篇文章主要介紹了ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
解讀Java中打印輸出對(duì)象內(nèi)容為什么可以不寫.toString()
這篇文章主要介紹了解讀Java中打印輸出對(duì)象內(nèi)容為什么可以不寫.toString()問題,具有很的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
File的API和常用方法詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了File的API和常用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot實(shí)現(xiàn)token登錄的示例代碼
在進(jìn)行登錄驗(yàn)證時(shí),我們需要session或cookie會(huì)話進(jìn)行驗(yàn)證,當(dāng)我們脫離瀏覽器用app等向服務(wù)端發(fā)請(qǐng)求就沒有session和cookie機(jī)制,這時(shí)我們就需要使用token令牌進(jìn)行登錄驗(yàn)證,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2022-03-03
java+jdbc+mysql+socket搭建局域網(wǎng)聊天室
這篇文章主要為大家詳細(xì)介紹了java+jdbc+mysql+socket搭建局域網(wǎng)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01

