JFinal學習筆記(四) 實現簡單的圖片上傳

圖片上傳是網站開發中非常常用的一個功能,本文將詳細描述在jfinal框架下如何實現圖片上傳功能。

首先我在實現圖片上傳功能時用到了uploadify插件,因此在開發時需要引入相應的文件,分別是uploadify.css、jquery-1.10.2.js、jquery.uploadify.min.js、uploadify.swf、uploadify-cancel.png。這些文件都可以在百度中找到,也可以點此下載,在我的項目中我把這些文件都保存在我在WebRoot文件夾下新建的JS文件夾和CSS文件夾下。

另外在jfinal框架下實現文件的上傳需要用到cos-26Dec2008.jar包,該文件可以在jfinal提供的庫中找到,也可以點此下載。然後將該jar包放入WEB-INF文件夾下的lib文件夾中,至此準備工作就完成了。

下面新建一個用於實現圖片上傳的jsp頁面名爲photo,其中代碼如下。

<span style="font-size:18px;"><%@ page language="java"  pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>上傳圖片</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="CSS/uploadify.css" />
</head>
<body>
	<input id="file_upload" name="uploadfile" type="file" multiple="true">
	<p id="upload_check"></p>
	<div id="queue"></div>
	<div id="show"></div>
	<script src="JS/jquery-1.10.2.js" type="text/javascript"></script>
	<script src="JS/jquery.uploadify.min.js" type="text/javascript"></script>
	<script type="text/javascript">
		$(document).ready(function(){
			$("#file_upload").uploadify({
				'swf' : 'JS/uploadify.swf',//調用的swf文件的位置
				'uploader' : 'upload',//指定文件上傳後調用的方法
				'method' : "post",
				'buttonText' : '選擇圖片上傳',//上傳按鈕的顯示文本
				'fileTypeExts' : '*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.JPG;*.JPEG;*.GIF; *.PNG;*.BMP',//可上傳的文件類型
				'fileTypeDesc' : '只允許上傳jpg,jpeg,gif,png,bmp文件。',//文件類型錯誤時的提示
				'queueSizeLimit' : 1,//批量上傳隊列的大型,這裏設爲1即一次只可以上傳一個文件
				'fileSizeLimit' : 1024 * 1024 * 10,//上傳文件的大小上限
				'removeCompleted' : true,
				'auto' : true,
				'multi' : false,
				'queueID' : 'queue',//上傳隊列上傳進度的現實位置id
				'onSelect' : function() {
					$("#queue").children().each(function() {
						$(this).css({
							margin : '7px',
							width : '70%'
						});
					});
				},
				'onUploadSuccess' : function(file, data,response) {//上傳成功後的回調函數
					$("#show").empty();
					var json = $.parseJSON(data);
					if (json.flag) {
						var $img = $('<img id="target"/>');
						$img.attr("src", "img/" + json.fileName);
						$("#show").append($img);
					}
					else {
						$("#upload_check").text(json.msg);
						$("#upload_check").show();
						setTimeout('$("#upload_check").hide()',
								5000);
					}
				}
			});
	
		});
	</script>
</body>
</html></span>
在這個頁面中將剛纔提到的uploadify所需的文件都進行了引入,其中uploadify這個方法是用於在客戶端實現文件選擇和上傳服務器的方法,該方法的參數有很多,根據不同的需要可以進行不同的設置,如有需要可查看官方的API文件這裏不做詳細展開。頁面完成後再IndexController類中添加一個名爲photo的方法,實現向photo.jsp的跳轉,其代碼如下。

<span style="font-size:18px;">public void photo(){
	render("photo.jsp");
}</span>
然後在IndexController類中添加一個名爲upload的方法用於實現對上傳的文件進行獲取和保存,其代碼如下。
<span style="font-size:18px;">	public void upload(){
		String fileName = "";
		String extName = "";
		boolean flag = false;
		String msg = "";
		try {
			String path = getSession().getServletContext().getRealPath("/")
					+ "img/";
			List<UploadFile> uf = getFiles(path);
			File file = uf.get(0).getFile();
			fileName = file.getName();
			extName = fileName.substring(fileName.lastIndexOf(".") + 1);
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyyMMddHHmmss");
			int temp = (int) (Math.random() * 9000 + 1000);
			fileName = getRequest().getRemoteAddr().replaceAll(":", "")
					+ dateFormat.format(new Date())
					+ new Integer(temp).toString() + "." + extName;//對文件進行重命名,防治文件重名。命名的規則是使用上傳客戶端的ip+上傳時間+四位隨機數的方法。
			file.renameTo(new File(path + fileName));
			flag = true;
			msg = "上傳成功";
		}
		catch (Exception e) {
			msg = "網絡超時,請重試。";
		}
		JSONObject json = new JSONObject();
		json.put("flag", flag);
		json.put("msg", msg);
		json.put("fileName", fileName);
		renderJson(json);
	}</span>

這裏有兩點需要說明,第一是我在獲取文件時使用的是getFiles這個方法,而不是getFile這個方法。這兩個方法的區別是前者可以獲取批量傳輸的文件,即當用戶一次傳輸多個文件時需要用getFiles方法來所有文件進行獲取,而getFile方法僅用於對單個文件的獲取上。而在這裏雖然我設置了一次只能獲取一個文件,但是我還是用了getFiles這個方法,主要原因是因爲我在嘗試用getFile方法時始終都無法獲取文件,其返回值永遠爲null,具體原因我到現在還沒搞清楚,如果有人知道原因請一定告訴我。另一個要說明的是關於文件重命名的問題,這裏我採用了通過文件上傳方ip加上傳時間加四位隨機數的方法來實現對文件的重命名,主要是爲了防止上傳的文件因爲重名而相互覆蓋,但後來我發現在jfinal中已經內置了一套預防重名的機制,因此不對文件進行重命名也是可以的。

至此圖片上傳的功能已經實現了,下面進行調試。首先打開圖片上傳頁面photo.jsp,其地址爲http://localhost:8080/jfinal_tomcat/photo,打開後頁面如下。


點擊按鈕選擇需要上傳的圖片,如下圖所示。


選擇第一張圖片點擊“打開”按鈕即完成了圖片的上傳,結果如下圖所示。


簡單的圖片上傳功能的實現就介紹到這裏,當然在具體的使用中爲了保持圖片信息通常會結合數據庫,將圖片的存儲位置保持在數據庫中,從而實現對圖片的動態調取。此外有時候出於對格式的統一需要實現對圖片的裁剪,這裏我推薦一個好用的裁剪插件Jcrop,但是在本文中我就不詳細說明的。如果後面有時間我會對裁剪功能的實現在進行詳細的說明,下一篇文章將介紹通過jfinal實現分頁顯示功能,但是因爲最近工作比較忙更新時間不定,還望見諒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章