ajaxfileupload对于json格式处理的问题(firefox、ie)
来源:互联网 发布:软件欢迎界面 素材 编辑:程序博客网 时间:2024/04/27 14:16
使用环境:springMVC、spring、mybatis、firefox22、ie9、mysql 5、tomcat 6,操作系统:window7旗舰版
最近使用ajaxfileupload.js这个组件,在异步上传文件后遇到两个问题:
1、使用spring集成jackson插件,获取到的json格式的数据,ajaxfileupload会自动在前后加上<pre></pre>标记,导致json格式无法正确解析。
解决办法:
找到ajaxfileupload的源码,tyep=="json"的位置,修改如下:
- if (type == "script")
- jQuery.globalEval(data);
- // Get the JavaScript object, if JSON is used.
- if (type == "json") {
- <span style="color:#FF0000;">if (data.startsWith("<pre>") && data.endsWith("</pre>")) {
- data = data.substr(5, data.length - 11);
- data = jQuery.parseJSON(data);
- } else {</span>
- eval("data = " + data);
- <span style="color:#FF0000;">}</span>
- }
即是去掉前后的标记,自己解析json数据。
2、需求:在获取到用户上传的excel文件,使用POI解析其中的内容,并写入内容的处理结果数据到excel,最后当数据解析完成后,将excel保存到服务器,并直接通知用户下载该文件(直接异步下载,弹出下载窗口)。
问题:在firefox下OK,在IE9下边,上传这一步,ie直接认为发送的是一个下载请求,直接弹出下载提示,下载的文件名为请求的action.do的名字。
问题分析:原来上传请求的action,发挥的是一个对象,通过jackson转换为json数据返回给前端,但ajaxfileupload无法识别这个数据,通过ie的断点调试,无法跟踪到发挥的数据到底是什么样的。而后台根本没有出现任何错误,前端也如此。后来,我将请求的action返回为一个string对象,严格按照json的格式拼装:
- return "{\"success\" : \"" + true + "\"}";
这样问题解决……但是很遗憾任然没有找出问题所在……
附上请求上传action方法的代码:
- @RequestMapping("import")
- @ResponseBody
- public String importWordsFromExcel(MultipartHttpServletRequest request, HttpSession session) {
- try {
- MultipartFile excel = request.getFile("excel");
- LOG.debug("begin import words from excel file :" + excel.getOriginalFilename());
- InputStream in = excel.getInputStream();
- Workbook wb = null;
- try {
- // 2003 - 2007
- wb = new HSSFWorkbook(in);
- LOG.debug("using excel 2003/2007");
- } catch (OfficeXmlFileException e) {
- // 2007以后的版本
- OPCPackage pkg = OPCPackage.open(in);
- wb = new XSSFWorkbook(pkg);
- LOG.debug("using excel 2010 or higher version.");
- }
- // 存放导入结果的列,无法实现
- int resultColIndex = 7;
- CellStyle failStyle = wb.createCellStyle();
- Font font = wb.createFont();
- font.setBoldweight(Font.BOLDWEIGHT_BOLD);
- font.setColor(HSSFColor.RED.index);
- failStyle.setFont(font);
- CellStyle succStyle = wb.createCellStyle();
- font = wb.createFont();
- font.setBoldweight(Font.BOLDWEIGHT_BOLD);
- font.setColor(HSSFColor.GREEN.index);
- succStyle.setFont(font);
- Vocabulary v = null;
- Sheet sheet = wb.getSheetAt(0);
- int totalColNum = 0;
- if (sheet.getRow(0) != null)
- totalColNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum();
- String sheetName = sheet.getSheetName();
- LOG.debug("current sheet name : " + sheetName);
- Cell cell = null;
- for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
- Row row = sheet.getRow(rowNum);
- if (rowNum == 0) {
- cell = row.createCell(resultColIndex);
- cell.setCellValue("完成状态");
- cell.setCellStyle(failStyle);
- cell = row.createCell(resultColIndex + 1);
- cell.setCellValue("说明");
- cell.setCellStyle(failStyle);
- continue;
- }
- v = new Vocabulary();
- for (int colNum = 0; colNum <= totalColNum; colNum++) {
- cell = row.getCell(colNum, Row.CREATE_NULL_AS_BLANK);
- CellReference cellRef = new CellReference(rowNum, colNum);
- LOG.debug("cell reference : " + cellRef.formatAsString());
- String content = "";
- if (cell.getCellType() == Cell.CELL_TYPE_STRING)
- content = cell.getRichStringCellValue().getString().trim();
- else if (cell.getCellType() == Cell.CELL_TYPE_BLANK)
- content = "";
- else {
- continue;
- }
- switch (colNum) {
- case 1: // 单词
- v.setWord(content);
- break;
- case 2: // 美式发音
- v.setSoundmark(content);
- break;
- case 3: // 英式发音
- v.setSoundmark2(content);
- break;
- case 4: // 释义
- v.setMeaning(content);
- break;
- case 5: // 例句
- v.setSentence(content);
- break;
- case 6: // 例句释义
- v.setSentenceMean(content);
- break;
- default:
- break;
- }
- }
- try {
- Vocabulary tmpV = service.getByWord(v.getWord());
- if (tmpV == null) {
- // 保存到数据库
- service.add(v);
- cell = row.createCell(resultColIndex);
- cell.setCellValue("成功");
- cell.setCellStyle(succStyle);
- cell = row.createCell(resultColIndex + 1);
- cell.setCellValue("导入成功.");
- // v.setStatus(Vocabulary.IMPORT_SUCCESS);
- // v.setResult("导入成功.");
- } else {
- cell = row.createCell(resultColIndex);
- cell.setCellValue("失败");
- cell.setCellStyle(failStyle);
- cell = row.createCell(resultColIndex + 1);
- cell.setCellValue("单词已经存在.");
- // v.setStatus(Vocabulary.IMPORT_FAIL);
- // v.setResult("单词已存在.");
- }
- } catch (Exception e) {
- LOG.error("save words error : ", e);
- cell = row.createCell(resultColIndex);
- cell.setCellValue("失败");
- cell.setCellStyle(failStyle);
- cell = row.createCell(resultColIndex + 1);
- cell.setCellValue("未知异常.");
- // v.setStatus(Vocabulary.IMPORT_FAIL);
- // v.setResult("未知异常.");
- }
- }
- String originalFilename = excel.getOriginalFilename();
- User user = SystemUtil.getLoginUser(session);
- resultFilePath = request.getSession().getServletContext().getRealPath("/") + "/resource/tmp/"
- + FilenameUtils.getBaseName(originalFilename) + "_导入结果_" + user.getName() + "."
- + FilenameUtils.getExtension(originalFilename);
- FileOutputStream out = new FileOutputStream(resultFilePath);
- wb.write(out);
- out.close();
- // GeneralMessage msg = new GeneralMessage();
- // msg.setCode(GeneralMessage.SUCCESS);
- // msg.setMsg("导入完成.");
- // return msg;
- return "{\"success\" : \"" + true + "\"}";
- } catch (Exception e) {
- LOG.error("import words error : ", e);
- }
- return null;
- }
下载结果文件的action方法:
- @RequestMapping("downloadResultFile")
- @ResponseBody
- public ResponseEntity<byte[]> downloadUploadResult(HttpServletRequest request, HttpServletResponse response) {
- try {
- if (!StringUtils.hasLength(resultFilePath))
- return null;
- String fileName = FilenameUtils.getName(resultFilePath);
- //
- // HttpHeaders headers = new HttpHeaders();
- // headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- // headers.setContentDispositionFormData("attachment", new String(f.getBytes("UTF-8"),
- // "ISO-8859-1"));
- // return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new
- // File(fileAbsolutePath)), headers, HttpStatus.CREATED);
- File file = new File(resultFilePath); // 根据文件路径获得File文件
- // 设置文件类型(这样设置就不止是下Excel文件了,一举多得)
- response.setContentType("application/msexcel;charset=GBK");
- // 文件名
- response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(fileName.getBytes("GBK"), "ISO-8859-1") + "\"");
- response.setContentLength((int) file.length());
- byte[] buffer = new byte[4096];// 缓冲区
- BufferedOutputStream output = null;
- BufferedInputStream input = null;
- try {
- output = new BufferedOutputStream(response.getOutputStream());
- input = new BufferedInputStream(new FileInputStream(file));
- int n = -1;
- while ((n = input.read(buffer, 0, 4096)) > -1) {
- output.write(buffer, 0, n);
- }
- output.flush(); // 不可少
- response.flushBuffer();// 不可少
- } catch (Exception e) {
- LOG.error("download upload words result file error : ", e);
- } finally {
- if (input != null)
- input.close();
- if (output != null)
- output.close();
- }
- } catch (Exception e) {
- LOG.error("download upload words result file error : ", e);
- }
- return null;
- }
前端javascript中的处理:
- function importFromExcel() {
- var excel = $("#excelFile").val();
- if (!excel || excel == ""
- || !(excel.endsWith("xls") || excel.endsWith("xlsx"))) {
- Error("未选择excel文件,请选择excel格式的文件后在进行导入操作.");
- return false;
- }
- $.ajaxFileUpload({
- url : Util.getContentPath() + '/word/import.do',
- secureuri : false,
- fileElementId : "excelFile",
- dataType : 'json',
- success : function(data, status) {
- var msg = data;
- if (msg && msg.success == "true") {
- var callback = function() {
- window.location.href = Util.getContentPath()
- + "/word/downloadResultFile.do";
- };
- Alert("导入完成,可能有部分单词为成功导入!您需要下载<b>导入结果文件</b>来查看详细信息,点击确定后开始下载.",
- callback);
- } else {
- Error("批量导入出错.");
- }
- },
- error : function(data, status, e) {
- Error("批量导入出错.");
- }
- });
- return false;
- }
0 0
- ajaxfileupload对于json格式处理的问题(firefox、ie)
- ajaxfileupload对于json格式处理的问题(firefox、ie)
- FireFox中使用JQuery的ajaxfileupload插件返回JSON格式数据提示保存的解决方法。
- 低版本IE对于JSON数据的处理
- C#中对于Json格式数据的处理
- 关于AjaxFileUpload后台返回Json的处理
- IE对于空格的处理
- 解决 IE下ajaxfileupload不兼容的问题
- 对于json格式数据节点的解析
- [转]firefox与IE的事件处理
- IE和FireFox处理childNodes的异同
- ie和firefox处理表单的差异
- ajaxFileUpload json数据对象传到前台,IE OK,但是火狐却变成了文件下载问题
- 处理json格式的数据时出现的问题
- 鼠标滚动事件onscroll在firefox/chrome/Ie中执行次数的问题处理
- ie 和 firefox宽度的问题
- IE和Chrome、FireFox的ContentType问题!
- ajaxFileUpload上传文件时IE浏览器弹出下载提示问题处理
- eclipse java ee开发jsp页面需要依赖java project文件时候的JEE Module Dependencies设置
- poj 1258 Agri-Net(最小生成树模板代码)
- springMVC + ajaxfileupload异步上传图片预览,裁剪并保存图片
- 科目三路考流程及注意事项
- 基于ocfs2内核代码的个人理解(一)
- ajaxfileupload对于json格式处理的问题(firefox、ie)
- 科目三靠边停车驾驶流程
- 【读书笔记】iOS6编程实战 8绘图功能1
- Cookie 的使用
- 科目三电子路考易错细节总结
- EF学习笔记——通用增删改查方案
- 狗墙网大事记
- 科目三夜考考试内容及过关攻略
- SpringMVC学习历程--SpringMVC第一个例子