使用uploadify上传

效果图:

效果图

修改:

  1. 报找不到uploadify-cancel.png文件。
    找到uploadify.css,找到.uploadify-queue-item .cancel a {,修改文件的路径。
  2. <div id="file_queue" style="width:400px;height:10px;position:absolute;z-index:999"></div>
    这里将file_queue对应div的样式设置成z-index:999,主要是为了防止队列表被其他的控件遮挡住。
  3. 好多人都说,在chrome、Firefox上使用uploadify的时候获取不到session导致上传出错。需要手工将session id方法附加参数中。但是我这里并没有这么做,并且在chrome、Firefox上传没问题,不知道为什么,也许是因为我用的最新版的原因吧。

要点:

  1. uploadify的js配置已经比较全面,在实际使用的时候可以适当的删减一些方法和属性。
  2. 一般情况下的单文件上传只考虑onSelectonUploadErroronUploadSuccess即可。
  3. 如果是多文件上传,那么在单文件上传的基础上再加上对整个队列的监听onQueueComplete
  4. 开始上传所有文件:$('#file_upload').uploadify('upload', '*');
  5. 取消上传:$('#file_upload').uploadify('cancel', parm);
  • parm为空:取消上传第一个文件。
  • parm为'*':取消所有的上传文件。
  • parm为file id:取消该file id对应的文件。
  1. 修改附加的一些变量:
    $('#file_upload').uploadify("settings","formData",{"name1":"中文name","parm1":"修改后的参数"});
    参数为json,如果该json中的某个变量已经有了,那么覆盖该属性,如果没有,那么追加该属性。
  2. 获取队列中文件的个数(应用场景,譬如说我点击上传按钮的时候,如果没有选择文件,可以提示请至少选择一个文件):
    var queueFils = $("#file_queue").children(".uploadify-queue-item");
    我的方法是读取页面上的html标签,很明显这不是一个好的解决方案,但是没有找到相应功能的api,谁知道这个怎么解决,请告知。
  3. 服务端设置编码为:upload.setHeaderEncoding("UTF-8");,这样解析的文件名称为正常中文。
    但是解析的附加变量中文乱码,这里做一次转码(总感觉转码比较low,不知道是哪里配置的不对)。
    new String(item.getString().getBytes("iso8859-1"),"utf-8")
  4. 服务端最后返回文件保存路径(这里可以随便定义返回内容)。

步骤:

  • 配置uploadify
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();%>
<%String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <base href="<%=basePath %>">
    <title></title>
    <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.3/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.3/themes/icon.css">
    <script type="text/javascript" src="jquery-easyui-1.4.3/jquery.min.js"></script>
    <script type="text/javascript" src="jquery-easyui-1.4.3/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="uploadify/uploadify/jquery.uploadify.min.js"></script>
    <link rel="stylesheet" type="text/css" href="uploadify/uploadify/uploadify.css" />
</head>
<script>
var fileUp;
$(function(){
    $(function() {
        $(function() {
        fileUp=$('#file_upload').uploadify({
                'uploader' : '<%=basePath%>/UploadServlet',//服务端地址
                'swf'      : 'uploadify/uploadify/uploadify.swf',
                'buttonImage' : 'uploadify/uploadify/img/chooseFile.jpg',//重载按钮图片
                'buttonClass' : 'some-class',//重载按钮样式
                'height':19,//按钮宽度和高度
                'width':76,
                'queueID'  : 'file_queue',//显示文件队列的一个div,在页面定义
                'formData' : {'parm1':'参数1','year':'2016'},//附加参数,可以在upload参数中更改
                'buttonText':'选择文件',//按钮显示文字,如果有图片的话,会被图片挡住
                'fileSizeLimit':'1MB',//文件最大
                'auto':false,//自动提交
                'fileTypeExts' : '*.gif; *.jpg; *.png',//文件类型
                'fileTypeDesc' : '只能上传图片',//选择文件的时候的提示信息
                'multi'    : true,//多选
                'queueSizeLimit' : 3,//队列中文件的个数
                'onSelect' : function(file) {
                    console.log(file);
                    alert("选择文件:" + file.name + "\n类型="+file.type+"\n大小="+file.size);
                    if(file.size>1024000){//文件太大,取消上传该文件
                        alert("文件大小超过限制!");
                        $('#file_upload').uploadify('cancel',file.id);
                    }
                },
                'onUploadSuccess' : function(file, data, response) {
                    alert('每个文件上传成功后触发 ' + file.name + ' was successfully uploaded with a response of ' + response + ':' + data);
                },
                'onUploadComplete' : function(file) {
                    alert('每个文件上传完成,无论对错都触发! ' + file.name + ' finished processing.');
                },
                'onUploadError' : function(file, errorCode, errorMsg, errorString) {
                    alert('上传出错 ' + file.name + ' could not be uploaded: ' + errorString);
                },
                'onQueueComplete':function(queueData){
                    alert("队列中的所有文件上传完成后触发。\n"+queueData.uploadsSuccessful+'\n'+queueData.uploadsErrored)
                },
            });
        });
    });
});
function upload(){
    $('#file_upload').uploadify("settings","formData",{"name1":"中文name","parm1":"修改后的参数"});
    $('#file_upload').uploadify('upload', '*');//上传所有文件
}
function cancel(){
    $('#file_upload').uploadify('cancel', '*');//取消所有文件
}
function destroy(){
    alert("取消upload上传,变成原来样式!");
    $('#file_upload').uploadify('destroy');//destory
}
function getCount(){
    var queueFils = $("#file_queue").children(".uploadify-queue-item");
    alert("队列中共有"+queueFils.length+"个文件!");
}
</script>
<body>
    <div class="easyui-panel" title="说明" style="margin-bottom:15px">
    </div>
    <div class="easyui-panel" style="text-align:center;margin-bottom:15px">
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="upload()">开始上传</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="cancel()">取消上传</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="destroy()">destroy</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" onclick="getCount()">获取上传队列中的文件个数</a>
        <input type="file" name="file_upload" id="file_upload" />
        <div id="file_queue" style="width:400px;height:10px;position:absolute;z-index:999"></div>
    </div>
</body>
</html>
  • 服务端
package com.servlet;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = -6483558339095298703L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor  stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("获取session,可以根据这个session进行一些其他的判断" + request.getSession().getId());
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
        String remotePath = File.separator + "download" + File.separator + sdf.format(new Date()) + File.separator;
        String savePath = remotePath;
        File dfile = new File(savePath);
        if (!dfile.exists()) {
            dfile.mkdirs();
        }
        DiskFileItemFactory fac = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setHeaderEncoding("UTF-8");
        List<FileItem> fileList = null;
        try {
            fileList = upload.parseRequest(request);
        } catch (FileUploadException ex) {
            return;
        }
    
        Iterator<FileItem> it = fileList.iterator();
        String name = "";
        String extName = "";
        while (it.hasNext()) {
            FileItem item = it.next();
            if (!item.isFormField()) {
                name = item.getName();
                long size = item.getSize();
                String type = item.getContentType();
                System.out.println("文件=" + name + " " + size + " " + type);
                if (name == null || name.trim().equals("")) {
                    continue;
                }
                // 扩展名格式:
                if (name.lastIndexOf(".") >= 0) {
                    extName = name.substring(name.lastIndexOf("."));
                }
                File file = null;
                do {
                    // 生成文件名:
                    name = UUID.randomUUID().toString();
                    file = new File(savePath + name + extName);
                } while (file.exists());
                File saveFile = new File(savePath + name + extName);
                try {
                    item.write(saveFile);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else if(item.isFormField()){
                System.out.println("表单内容:" + item.getFieldName() + "=" + new String(item.getString().getBytes("iso8859-1"),"utf-8"));
            }
        }
        String requestPath = remotePath + name + extName;
        request.getSession().setAttribute(requestPath, requestPath);
        response.getWriter().write(savePath + name + extName);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容