luckystar +
send mail to luckystar sina weibo
关于订阅 luckystar's blog » Project »
分类:
标签:
上一篇:获取项目的路径
下一篇:Java图片缩放

AjaxFileUpload官网:http://www.phpletter.com/Our-Projects/AjaxFileUpload/
有使用示例,插件下载在页面的最下方“Where to download”那里。

前端页面的示例代码就不说了,官网已经写的很清楚。下面直接上代码。
实现的功能时,用户选择一个文件,然后点击上传按钮,上传成功后页面显示上传的图片。
页面:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@include file="/commons/taglibs.jsp" %>    
<!DOCTYPE html>
<html>
<head>
<title>AjaxFileUpload Demo</title>
    <script type="text/javascript" src="${root}/scripts/jquery.js"></script>  
    <script type="text/javascript" src="${root}/scripts/ajaxfileupload.js"></script>  
    <script type="text/javascript">
        $(function(){
            $('#loading').ajaxStart(function(){
                $(this).show();
            }).ajaxComplete(function(){
                $(this).hide();
            });
            
            $('#uploadBtn').click(function(){
                if ($.trim($('#file1').val()).length > 0) {
                    $.ajaxFileUpload(
                    {
                        url:'${root}/ajaxFileUpload/upload',
                        secureuri:false,
                        fileElementId:'file1',
                        dataType:'json', // 返回的结果被包装在<pre>标签中,报语法错误。
                        data:{ // 额外的数据
                            ts:new Date().getTime()
                        },
                        success:function(data,status){
                            if(typeof(data.error) != 'undefined') {
                                 if(data.error != '') {
                                  alert('erorr:' + data.error);
                                 }
                                 else {
                                  alert(data.msg);
                                  $('#preview').attr('src',data.savePath).show();                                     
                                 }
                            }
                        },
                        error:function(data,status,e) {
                            alert(e);
                        }
                    }
                    );
                }
                else {
                    alert("请选择文件");
                }
                
                return false;
            });
        });
    </script>
</head>
<body>
    <div id="loading" style="display:none;">文件正在上传,请稍后...</div>
    <div>
        <input type="file" id="file1" name="file"><input type="button" value="Upload" id="uploadBtn"><br>
        <img id='preview' src='' style='display:none;width:50%;height:50%;'>
    </div>
</body>
</html>

后台上传代码:

package com.company.project.controller;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javacommon.base.BaseRestSpringController;

@Controller
@RequestMapping(value="/ajaxFileUpload")
public class AjaxFileUploadController extends BaseRestSpringController<Object, Object>{

    @RequestMapping(value="/upload")
    @ResponseBody
    public Map<String, String> uplaod(HttpServletRequest request) {
        Map<String,String> map = new HashMap<String, String>();
        map.put("error", "");
        map.put("msg", "上传成功!");
        
        DiskFileItemFactory dfif = new DiskFileItemFactory();
        // 设置缓存大小,如果文件大小超过缓存大小,将使用临时目录作为缓存
        dfif.setSizeThreshold(1024*1024);
        // 保存到项目决定位置下的upload文件夹,比如:d:/tomcat/webapps/rapiddemo/upload/xxxxxxxxx.jpg
        String webRoot = request.getSession().getServletContext().getRealPath("/") + "upload/";
        // 项目相对位置(用于在页面显示),比如:/rapiddemo/upload/xxxxxxxxx.jpg
        String webRootRelative = request.getContextPath() + "/upload/";
        File uploadDir = new File(webRoot);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        
        String ts = null;
        ServletFileUpload sfu = new ServletFileUpload(dfif);
        try {
            List<FileItem> fileItemList = sfu.parseRequest(request);
            for (int i=0;i<fileItemList.size();i++) {
                FileItem fi = fileItemList.get(i);
                if (fi.isFormField()) {
                    String filedName = fi.getFieldName();
                    String filedValue = fi.getString();
                    System.out.println(filedName + ":" + filedValue);
                    
                    if (filedName.equals("ts")) {
                        ts = filedValue;
                    }
                }
                else {
                    // 文件
                    String fileNameFullPath = fi.getName();
                    // 取文件后缀
                    String fileExt = fileNameFullPath.substring(fileNameFullPath.lastIndexOf("."));
                    // 随机文件名:yyyymmddhhmiss+3位随机数
                    String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()) + new Random().nextInt(1000) + fileExt;
                    fi.write(new File(webRoot + fileName));
                    System.out.println("文件【" + fileNameFullPath + "】上传成功!\n路径:" + (webRoot + fileName));
                    map.put("savePath",(webRootRelative + fileName));
                    System.out.println("文件上传时间:" + ts);
                }
            }
        } catch (FileUploadException e) {
            map.put("error", "上传失败:" + e.getMessage());
            e.printStackTrace();
        } catch (Exception e) {
            map.put("error", "上传失败:" + e.getMessage());
            e.printStackTrace();
        }
        return map;
    }
}

但是这样呢,有一个问题,文件是上传成功了,但是页面提示语法错误。如下:
SyntaxError:unexpected token <

将dataType改成content,alert data的内容,可以看到返回的json被pre标签包裹,所以出现了这个错误。

可以通过修改ajaxfileupload.js来解决这个问题。找到uploadHttpData方法定义的地方,将type = json时的处理逻辑改一下,去掉>。
增加如下代码:

////////////add code begin///////////////   
 data = r.responseText;   
 var start = data.indexOf(">");   
 if(start != -1) {   
   var end = data.indexOf("<", start + 1);   
   if(end != -1) {   
     data = data.substring(start + 1, end);   
    }   
 }   
  ///////////add code end///////////////

关于多文件上传,可以参考:http://blog.csdn.net/zhanglu201112/article/details/17039137

作者:qincidong
出处:http://qincidong.github.io/blog/2015/02/03/jquery-ajaxfileupload.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分类: 标签:
友荐云推荐