javascript
uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案
由于技術(shù)選型的原因,在一個(gè)產(chǎn)品中,我選擇了uploadify,選擇它的原因是它有完善的技術(shù)文檔說(shuō)明(http://www.uploadify.com/documentation/),唯一不足的是官方文檔上的例子是用php寫(xiě)的。而對(duì)與我們這些使用Java語(yǔ)言的小生們而言,在遇到問(wèn)題后發(fā)現(xiàn)找到一個(gè)適合自己的例子很不好找。特別是當(dāng)遇到瀏覽器兼容問(wèn)題的時(shí)候,找了好久最終發(fā)現(xiàn)按照網(wǎng)上的方式進(jìn)行編寫(xiě)了,最終還是會(huì)出現(xiàn)莫名其妙的問(wèn)題,而繼續(xù)查找資料的時(shí)候,發(fā)現(xiàn)講解的并不詳細(xì)。
下面我就把我遇到的這些問(wèn)題現(xiàn)象、以及解決方案和大家分享一下,希望能夠幫助大家快速解決Java項(xiàng)目中的問(wèn)題。
錯(cuò)誤現(xiàn)象:
在:IE瀏覽器和谷歌瀏覽器中,當(dāng)使用uploadify進(jìn)行文件上傳的時(shí)候,是正常的,能夠上傳成功,當(dāng)使用火狐瀏覽器的時(shí)候,發(fā)現(xiàn)死活也上傳不了。沒(méi)有任何反應(yīng),真是氣死人啊。
解決方法:
在百度上搜索”uploadify兼容性/uploadify不兼容獲取”,發(fā)現(xiàn)搜出很多,但仔細(xì)看,發(fā)現(xiàn)似乎都是一個(gè)人寫(xiě)的文章。解釋的主要原因是(下面一段摘抄自:http://blog.csdn.net/longlong821/article/details/7785703):
| ?jquery uploadify在ie下可以正常上傳,在實(shí)現(xiàn)異步上傳的時(shí)候,每一個(gè)文件在上傳時(shí)都會(huì)提交給服務(wù)器一個(gè)請(qǐng)求。每個(gè)請(qǐng)求都需要安全驗(yàn)證,session和cookie的校驗(yàn)。是的,就是這樣。由于jquery uploadify是借助flash來(lái)實(shí)現(xiàn)上傳的,每一次向后臺(tái)發(fā)送數(shù)據(jù)流請(qǐng)求時(shí),ie會(huì)自動(dòng)把本地cookie存儲(chǔ)捆綁在一起發(fā)送給服務(wù)器。但firefox、chrome不會(huì)這樣做,他們會(huì)認(rèn)為這樣不安全。 |
| Session又稱(chēng)為會(huì)話狀態(tài),是Web系統(tǒng)中最常用的狀態(tài),用于維護(hù)和當(dāng)前瀏覽器實(shí)例相關(guān)的一些信息。舉個(gè)例子來(lái)說(shuō),我們可以把已登錄用戶(hù)的用戶(hù)名放在Session中,這樣就能通過(guò)判斷Session中的某個(gè)Key來(lái)判斷用戶(hù)是否登錄,如果登錄的話用戶(hù)名又是多少。 ??????? 我們知道,Session對(duì)于每一個(gè)客戶(hù)端(或者說(shuō)瀏覽器實(shí)例)是“人手一份”,用戶(hù)首次與Web服務(wù)器建立連接的時(shí)候,服務(wù)器會(huì)給用戶(hù)分發(fā)一個(gè) SessionID作為標(biāo)識(shí)。SessionID是一個(gè)由24個(gè)字符組成的隨機(jī)字符串。用戶(hù)每次提交頁(yè)面,瀏覽器都會(huì)把這個(gè)SessionID包含在 HTTP頭中提交給Web服務(wù)器,這樣Web服務(wù)器就能區(qū)分當(dāng)前請(qǐng)求頁(yè)面的是哪一個(gè)客戶(hù)端。 |
接著結(jié)合http://www.jb51.net/article/40380.htm中的例子:
| <script type="text/javascript">? |
| 最關(guān)鍵的就是紅字那部份了,要注意的是jsessionid前面那個(gè)是個(gè)分號(hào)而不是問(wèn)號(hào),寫(xiě)成問(wèn)號(hào)就作為參數(shù)傳遞了 |
最后在進(jìn)行搜索,由于uploadify依賴(lài)flash,所以建議安裝針對(duì)火狐的Adobeflash插件.
最后編寫(xiě)自己的uploadify上傳例子:
| 1、編寫(xiě)jsessionid獲取的例子,在我們項(xiàng)目中,我把它放在了common-session.jsp中,內(nèi)容如下(這樣寫(xiě)的原因是,我們的前后臺(tái)用的不同的common.jsp,為了前后臺(tái)都使用同一套的jsessionid,通過(guò)<%@ include file="common-session.jsp" %>包含進(jìn)去,注意:如果不這樣做,而是分別在兩套common.jsp中寫(xiě)如下的jsessionid的代碼,最終發(fā)現(xiàn)要么后臺(tái)能夠使用上傳;要么前臺(tái)能夠使用上傳;或者前臺(tái)上傳一次之后,再去后臺(tái)上傳,發(fā)現(xiàn)上傳不了了,反之也是同樣的效果): |
| <%@ 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、編寫(xiě)后臺(tái)java上傳邏輯,這里我是用的是springMVC+Spring+MyBatis,后臺(tái)代碼如下(關(guān)于下面代碼,并非我所寫(xiě),不覺(jué)得下面的java代碼是規(guī)范的,此處允許大家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();//獲取當(dāng)前時(shí)間 ???????????????????????????????????? //時(shí)間路徑,解壓文件,以年月日創(chuàng)建文件夾 ???????????????????????????????????? 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(); ???????????????????????????????????? //隨機(jī)生成32位id,用于解壓文件目錄 ???????????????????????????????????? String uuid = UUIDGenerator.generate(); ???????????????????????????????????? //新的文件名,隨機(jī)的uuid; ???????????????????????????????????? String picName = uuid +”.”+suffix; ???????????????????????????????????? ???????????????????????????????????? //上傳圖片生成路徑 ???????????????????????????????????? String imgPath =ExtendedServerConfig.getInstance() ???????????????????????????????????????????????????????????????? .getStringProperty(“THUMBNAIL_PATH”)+ ExtendedServerConfig.getInstance() ???????????????????????????????????????????????????????????????? .getStringProperty(“BACKGROUND_IMG_PATH”)+dataPath; ???????????????????????????????????? //生成圖片預(yù)覽路徑 ???????????????????????????????????? String picturePath =ExtendedServerConfig.getInstance() ??????????????????????????????????????????????????????? .getStringProperty(“BACKGROUND_IMG_PATH”)+dataPath+picName; ???????????????????????????????????? //文件夾不存在,則創(chuàng)建 ???????????????????????????????????? ?File destfile = new File(imgPath); ???????????????????????????????????? ?? if(!destfile.exists()){ ?????????????????????????????????????????????? ?? destfile.mkdirs(); ???????????????????????????????????? ?? } ???????????????????????????????????? // 寫(xiě)文件 ???????????????????????????????????? InputStream fi = imageFile.getInputStream(); ???????????????????????????????????? //上傳文件寫(xiě)入到配置文件夾下 ???????????????????????????????????? FileUtils.writeFile(fi, imgPath+picName); ???????????????????????????????????? File file = new File(imgPath+picName); ???????????????????????????????????? if(file.exists()){ ???????????????????????????????????? ??? result.put(“imgPath”, picturePath);//返回的圖片預(yù)覽路徑 ???????????????????????????????????? ??? result.put(“ilename”, srcName); ???????????????????????????????????? } ??????????????????????????? } catch (Exception e) { ???????????????????????????????????? e.printStackTrace(); ??????????????????????????? } ?????????????????? } ? ?????????????????? return JSONObject.fromObject(result).toString(); ???????? } } |
| 4、編寫(xiě)uploadify的js上傳方法: |
| /** ?* 背景圖片上傳 ?* @param uploadId 背景設(shè)置中"選擇"按鈕的id ?* @param imgDivId 背景設(shè)置中"圖片"小預(yù)覽圖所在div的Id ?* @param imgSrcId 背景設(shè)置中"img標(biāo)簽的id,給src賦值用到 ?* @param bgImgPath 隱藏的文本框值,存儲(chǔ)的是圖片路徑,取消是用到 ?* @param childPathOfSelectedElement 表示被選擇了的 ?* @param posFlag 表示對(duì)應(yīng)的是針對(duì)誰(shuí)進(jìn)行標(biāo)題設(shè)置 ?*??????????????? "0":表示標(biāo)題 ?*??????????????? "1": 表示列表 ?*/ function uploadBackgroundImg(uploadId,imgDivId,imgSrcId,bgImgPath,childPathOfSelectedElement,posFlag){ ?? ?? $("#"+uploadId).uploadify({ ??????? //是否自動(dòng)上傳 ??????? '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', ??????? //上傳數(shù)量 ??????? 'queueSizeLimit' : 1, ??????? 'queueID': 'fileQueue', ??????? //上傳到服務(wù)器,服務(wù)器返回相應(yīng)信息到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");//移除原來(lái)的背景圖片 ????? ??????? var styleCss = $("#generatedCss").text(); ????? ??????? var styleText = "#" + id + childPathOfSelectedElement +" {background-image: url('"+path+"') !important;}"; ??????????? //替換或者在最后拼接 ??????????? styleCss += "\r\n" + styleText; ??????????? $("#generatedCss").text(styleCss); ??????????? ??????????? //表示的是標(biāo)題 ??????????? if("0" == posFlag){ ??????????????? //設(shè)置相關(guān)的參數(shù)信息 ??????????????? $("." + id + "_titleBackgroundAbsoluteImg").val(path); ??????????????? $("." + id + "_titleBackgroundRelativeImg").val(imgPath); ??????????? } ??????????? //表示的是列表 ??????????? else if("1" == posFlag) { ??????????????? console.log("此處暫時(shí)略掉"); ??????????? } ??????? ?? } ??????? } ??? }); } |
| 注意上面的'uploader': basePath+'/import/uploadPicture.action;jsessionid=' + jsessionid, |
?
?
總結(jié)
以上是生活随笔為你收集整理的uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 卡尔文克雷思城堡干红多少钱?
- 下一篇: 中国特色白酒品牌——上海贵酒?