javascript
uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案
由于技術選型的原因,在一個產品中,我選擇了uploadify,選擇它的原因是它有完善的技術文檔說明(http://www.uploadify.com/documentation/),唯一不足的是官方文檔上的例子是用php寫的。而對與我們這些使用Java語言的小生們而言,在遇到問題后發現找到一個適合自己的例子很不好找。特別是當遇到瀏覽器兼容問題的時候,找了好久最終發現按照網上的方式進行編寫了,最終還是會出現莫名其妙的問題,而繼續查找資料的時候,發現講解的并不詳細。
下面我就把我遇到的這些問題現象、以及解決方案和大家分享一下,希望能夠幫助大家快速解決Java項目中的問題。
錯誤現象:
在:IE瀏覽器和谷歌瀏覽器中,當使用uploadify進行文件上傳的時候,是正常的,能夠上傳成功,當使用火狐瀏覽器的時候,發現死活也上傳不了。沒有任何反應,真是氣死人啊。
解決方法:
在百度上搜索”uploadify兼容性/uploadify不兼容獲取”,發現搜出很多,但仔細看,發現似乎都是一個人寫的文章。解釋的主要原因是(下面一段摘抄自:http://blog.csdn.net/longlong821/article/details/7785703):
| ?jquery uploadify在ie下可以正常上傳,在實現異步上傳的時候,每一個文件在上傳時都會提交給服務器一個請求。每個請求都需要安全驗證,session和cookie的校驗。是的,就是這樣。由于jquery uploadify是借助flash來實現上傳的,每一次向后臺發送數據流請求時,ie會自動把本地cookie存儲捆綁在一起發送給服務器。但firefox、chrome不會這樣做,他們會認為這樣不安全。 |
| Session又稱為會話狀態,是Web系統中最常用的狀態,用于維護和當前瀏覽器實例相關的一些信息。舉個例子來說,我們可以把已登錄用戶的用戶名放在Session中,這樣就能通過判斷Session中的某個Key來判斷用戶是否登錄,如果登錄的話用戶名又是多少。 ??????? 我們知道,Session對于每一個客戶端(或者說瀏覽器實例)是“人手一份”,用戶首次與Web服務器建立連接的時候,服務器會給用戶分發一個 SessionID作為標識。SessionID是一個由24個字符組成的隨機字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web服務器,這樣Web服務器就能區分當前請求頁面的是哪一個客戶端。 |
接著結合http://www.jb51.net/article/40380.htm中的例子:
| <script type="text/javascript">? |
| 最關鍵的就是紅字那部份了,要注意的是jsessionid前面那個是個分號而不是問號,寫成問號就作為參數傳遞了 |
最后在進行搜索,由于uploadify依賴flash,所以建議安裝針對火狐的Adobeflash插件.
最后編寫自己的uploadify上傳例子:
| 1、編寫jsessionid獲取的例子,在我們項目中,我把它放在了common-session.jsp中,內容如下(這樣寫的原因是,我們的前后臺用的不同的common.jsp,為了前后臺都使用同一套的jsessionid,通過<%@ include file="common-session.jsp" %>包含進去,注意:如果不這樣做,而是分別在兩套common.jsp中寫如下的jsessionid的代碼,最終發現要么后臺能夠使用上傳;要么前臺能夠使用上傳;或者前臺上傳一次之后,再去后臺上傳,發現上傳不了了,反之也是同樣的效果): |
| <%@ page isELIgnored=”false” %> <%@ page language=”java” pageEncoding=”UTF-8”%> <%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %> <% String sessionid =? session.getId(); %> <c:set var=”jsessionid” value=”<%=sessionid %>” scope=”session”/> <script name=”systemJs” type=”text/javascript”> var jsessionid = ‘${jsessionid}’; </script> |
| 2、在common.jsp中引入上面的"common-session.jsp |
| 3、編寫后臺java上傳邏輯,這里我是用的是springMVC+Spring+MyBatis,后臺代碼如下(關于下面代碼,并非我所寫,不覺得下面的java代碼是規范的,此處允許大家hehe 和吐槽): |
| package XXXX; ? import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONObject; ? import org.apache.log4j.Logger; /**此處略去一部分代碼**/ ? @Controller @RequestMapping(value = “/import”, method = { RequestMethod.GET,RequestMethod.POST }) public class ImportController extends BaseController{ ???????? /** 用于打印日志 */ ???????? private static final Logger logger = Logger ??????????????????????????? .getLogger(SpecialController.class); ???????? /** ???????? ?* 圖片上傳 ???????? ?* @param param ???????? ?* @param imageFile ???????? ?* @return ???????? ?*/ ???????? @RequestMapping(value = “/uploadPicture”, produces = “text/json”) ???????? @ResponseBody ???????? public String uploadPicture(@RequestParam(“file”) MultipartFile imageFile) { ?????????????????? Map<String, Object> result = new HashMap<String, Object>(); ?????????????????? if (!imageFile.isEmpty()) { ??????????????????????????? try { ???????????????????????????????????? Calendar calendar = Calendar.getInstance();//獲取當前時間 ???????????????????????????????????? //時間路徑,解壓文件,以年月日創建文件夾 ???????????????????????????????????? String dataPath =”/”+calendar.get(Calendar.YEAR)+”/” ???????????????????????????????????????????????????????????????? + (calendar.get(Calendar.MONTH)+1)+”/” + calendar.get(Calendar.DATE)+”/”; ???????????????????????????????????? // 原文件名 ???????????????????????????????????? String srcName = imageFile.getOriginalFilename(); ???????????????????????????????????? //獲取上傳文件后綴 ???????????????????????????????????? String suffix = srcName.substring(srcName.lastIndexOf(“.”) + 1, ??????????????????????????????????????????????????????? srcName.length()).toLowerCase(); ???????????????????????????????????? //隨機生成32位id,用于解壓文件目錄 ???????????????????????????????????? String uuid = UUIDGenerator.generate(); ???????????????????????????????????? //新的文件名,隨機的uuid; ???????????????????????????????????? String picName = uuid +”.”+suffix; ???????????????????????????????????? ???????????????????????????????????? //上傳圖片生成路徑 ???????????????????????????????????? String imgPath =ExtendedServerConfig.getInstance() ???????????????????????????????????????????????????????????????? .getStringProperty(“THUMBNAIL_PATH”)+ ExtendedServerConfig.getInstance() ???????????????????????????????????????????????????????????????? .getStringProperty(“BACKGROUND_IMG_PATH”)+dataPath; ???????????????????????????????????? //生成圖片預覽路徑 ???????????????????????????????????? String picturePath =ExtendedServerConfig.getInstance() ??????????????????????????????????????????????????????? .getStringProperty(“BACKGROUND_IMG_PATH”)+dataPath+picName; ???????????????????????????????????? //文件夾不存在,則創建 ???????????????????????????????????? ?File destfile = new File(imgPath); ???????????????????????????????????? ?? if(!destfile.exists()){ ?????????????????????????????????????????????? ?? destfile.mkdirs(); ???????????????????????????????????? ?? } ???????????????????????????????????? // 寫文件 ???????????????????????????????????? InputStream fi = imageFile.getInputStream(); ???????????????????????????????????? //上傳文件寫入到配置文件夾下 ???????????????????????????????????? FileUtils.writeFile(fi, imgPath+picName); ???????????????????????????????????? File file = new File(imgPath+picName); ???????????????????????????????????? if(file.exists()){ ???????????????????????????????????? ??? result.put(“imgPath”, picturePath);//返回的圖片預覽路徑 ???????????????????????????????????? ??? result.put(“ilename”, srcName); ???????????????????????????????????? } ??????????????????????????? } catch (Exception e) { ???????????????????????????????????? e.printStackTrace(); ??????????????????????????? } ?????????????????? } ? ?????????????????? return JSONObject.fromObject(result).toString(); ???????? } } |
| 4、編寫uploadify的js上傳方法: |
| /** ?* 背景圖片上傳 ?* @param uploadId 背景設置中"選擇"按鈕的id ?* @param imgDivId 背景設置中"圖片"小預覽圖所在div的Id ?* @param imgSrcId 背景設置中"img標簽的id,給src賦值用到 ?* @param bgImgPath 隱藏的文本框值,存儲的是圖片路徑,取消是用到 ?* @param childPathOfSelectedElement 表示被選擇了的 ?* @param posFlag 表示對應的是針對誰進行標題設置 ?*??????????????? "0":表示標題 ?*??????????????? "1": 表示列表 ?*/ function uploadBackgroundImg(uploadId,imgDivId,imgSrcId,bgImgPath,childPathOfSelectedElement,posFlag){ ?? ?? $("#"+uploadId).uploadify({ ??????? //是否自動上傳 ??????? 'auto':true, ??????? 'height':37, ??????? 'swf': scriptsPath+"/uploadify/uploadify.swf", ??????? //文件選擇后的容器ID ??????? 'queueID':'uploadItemList', ??????? 'fileObjName':'file', ??????? //上傳處理程序 ??????? 'uploader': basePath+'/import/uploadPicture.action;jsessionid=' + jsessionid, ??????? //允許上傳的文件后綴 ??????? 'fileTypeExts':'*.jpg;*.gif;*.png;', ??????? //上傳文件的大小限制 ??????? 'fileSizeLimit':'300MB', ??????? //上傳數量 ??????? 'queueSizeLimit' : 1, ??????? 'queueID': 'fileQueue', ??????? //上傳到服務器,服務器返回相應信息到data里 ??????? 'onUploadSuccess':function(file, data,response){ ??????? ?? var o = $.parseJSON(data); ??????? ?? var imgPath = o.imgPath; ??????? ?? if(imgPath=="" || imgPath ==null){ ??????? ????? alert("圖片上傳不成功"); ??????? ?? }else{ ??????? ????? $("#"+imgDivId).show(); ??????? ????? var path = vPath +imgPath; ??????? ????? $("#"+imgSrcId).attr("src",path); ??????? ????? $("#"+bgImgPath).val(imgPath); ????? ??????? var id = selectedElementInfo.get("id"); //獲得id的屬性值 ????? ??????? $.tplComponentListSetting.removeCss(id,childPathOfSelectedElement,"background-image");//移除原來的背景圖片 ????? ??????? var styleCss = $("#generatedCss").text(); ????? ??????? var styleText = "#" + id + childPathOfSelectedElement +" {background-image: url('"+path+"') !important;}"; ??????????? //替換或者在最后拼接 ??????????? styleCss += "\r\n" + styleText; ??????????? $("#generatedCss").text(styleCss); ??????????? ??????????? //表示的是標題 ??????????? if("0" == posFlag){ ??????????????? //設置相關的參數信息 ??????????????? $("." + id + "_titleBackgroundAbsoluteImg").val(path); ??????????????? $("." + id + "_titleBackgroundRelativeImg").val(imgPath); ??????????? } ??????????? //表示的是列表 ??????????? else if("1" == posFlag) { ??????????????? console.log("此處暫時略掉"); ??????????? } ??????? ?? } ??????? } ??? }); } |
| 注意上面的'uploader': basePath+'/import/uploadPicture.action;jsessionid=' + jsessionid, |
?
?
總結
以上是生活随笔為你收集整理的uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卡尔文克雷思城堡干红多少钱?
- 下一篇: 中国特色白酒品牌——上海贵酒?