多文件上传

**

文件上传之多图片上传(使用servlet):

**

jar包: commons-io-2.4.jar
commons-fileupload-1.2.2.jar

<form id="form" enctype="multipart/form-data" method="post" action="">
<input type="file" id="xdaTanFileImg" multiple="multiple" accept="image/png" name="fileAttach"
       onchange="xmTanUploadImg(this)"/>
</form>

其中accept后:限制图片格式为png, enctype="multipart/form-data"为必选,缺少则后台接收不到数据

function xmTanUploadImg(obj) {
    var fl = obj.files.length;   //获取file选中的文件长度
    for (var i = 0; i < fl; i++) {
        var file = obj.files[i];
        var reader = new FileReader();

    //读取文件过程方法

    reader.onloadstart = function (e) {
        console.log("开始读取....");
    }
    reader.onprogress = function (e) {
        console.log("正在读取中....");
    }
    reader.onabort = function (e) {
        console.log("中断读取....");
    }
    reader.onerror = function (e) {
        console.log("读取异常....");
    }
    reader.onload = function (e) {
        console.log("成功读取....");

        var imgstr = '<img  src="' + e.target.result + '"/>';
        var oimgbox = document.getElementById("imgboxid");
        var ndiv = document.createElement("div");

        ndiv.innerHTML = imgstr;
        ndiv.className = "img-div";
        oimgbox.appendChild(ndiv);
    }

    reader.readAsDataURL(file);
}

}

将表单进行提交:

var form = new FormData($("#form")[0]); //将表单转化为json格式,可用于文件上传
$.ajax({
    url: "../UpLoadServlet",
    type: "post",
    data: form,
    processData: false,//取消帮我们格式化数据,是什么就是什么
    contentType: false, //ajax2.0可以不用设置请求头,但是jq帮我们自动设置了,这样的话需要我们自己取消掉
    success: function () {
        alert("发布成功");
        $("textarea[name=cont_input]").val("");
        $(".img-box").empty();
        $(".img-box").hide();
    },
    error: function (e) {
        alert("发布失败");
    }
})

processData,contentType这两个参数必要设置,不然会出现后边得不到文件信息

文件上传之后台:

//判断是否添加了enctype属性
boolean isMultiPart = ServletFileUpload.isMultipartContent(request);
if (isMultiPart) {
    //获取文件上传的路径,即文件保存到哪个文件夹下(是服务器中的绝对路径)
    String filePath = request.getServletContext().getRealPath("upload/");
    System.out.println(filePath);
    //获取文件上传的核心对象(工厂模式)
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload fileUpload = new ServletFileUpload(factory);

    //String userId = request.getSession().getAttribute("");
    String userId = "u123458"; //用户id
    String mid = RandomSuiJi.graphicRandom(); //消息id
    int mfav = 0; //收藏次数
    int mreply = 0; //回复次数
    int mcopy = 0; //转发次数
    int dianZan = 0;//点赞次数
    String mdatetime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    String mcontent = null; //消息内容
    int quanXian = 3; //观看权限(默认所有人可见)
    String imgpath = null;
    int imgRow = 0;//记录存储图片

    try {
        //获取表单数据
        List<FileItem> fileItems = fileUpload.parseRequest(request);
        Iterator<FileItem> itemIterator = fileItems.iterator();
        Message message = new Message();
        Photo photo = new Photo();
        while (itemIterator.hasNext()) {
            FileItem fileItem = itemIterator.next();
            //区分普通字段跟文件字段
            if (fileItem.isFormField()) {
                //普通字段要封装成对象添加到数据库中
                //内容
                if (fileItem.getFieldName().equals("cont_input")) {
                    // System.out.println("用户名:" + fileItem.getString("UTF-8"));
                    mcontent = fileItem.getString("UTF-8");
                }
                //权限
                if (fileItem.getFieldName().equals("quanXian")) {
                    quanXian = Integer.parseInt(fileItem.getString());
                }
                message.setMid(mid);
                message.setUid(userId);
                message.setMfav(mfav);
                message.setMreply(mreply);
                message.setMcopy(mcopy);
                message.setMdatetime(mdatetime);
                message.setMcontent(mcontent);
                message.setQuanXian(quanXian);
                message.setDianzan(dianZan);

            } else {
                //文件字段要调用方法进行上传
                String filename = fileItem.getName();//客户端文件上传的绝对路径
                File file = new File(filename);
                if (file.getName() != "") {
                    File file1 = new File(filePath, new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) +file.getName() );//创建 服务器upload文件夹下名为当前时间的文件
                    imgpath = "../upload/" + file1.getName();
                    System.out.println(imgpath);
                    photo.setMid(mid);
                    photo.setPid(RandomSuiJi.graphicRandom());
                    photo.setImgpath(imgpath);
                    imgRow = photoService.addImg(photo);
                    fileItem.write(file1);
                }
            }
        }
        //将消息存到message表
        MessageService messageService = new MessageServiceImpl();
        int row = messageService.insertMess(message);

        if (row > 0) {
            out.print("<script>alert('发布成功')</script>");
            if (imgRow == 0) {
                out.print("<script>alert('图片发布失败')</script>");
            }
        } else {
            out.print("<script>alert('发布失败')</script>");
        }

    } catch (FileUploadException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
        out.print("<script>alert('图片上传失败,请联系管理员');location.href='index.html';</script>");
    }
} else {
    out.print("<script>alert('请添加enctype属性');location.href='index.html';</script>");
}

坑1:将文件的绝对路径保存到了数据库,如数据库长度不合适,会报数据过长,最好使用文件的相对路径
坑2:当使用当前时间来给文件命名时,当创建多个文件时,由于cpu运算速度太快,会导致文件同名从而导致上传的多个文件只保存一个! 解决:使用当前时间加文件名命名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值