webuploader一次性上传多张图片到后台,后台如何处理

studyforjava 发布于 2016/07/26 11:35
阅读 11K+
收藏 1

如题,我用webuploader上传图片,后台用springmvc,上传一张时没有问题,但一次性上传多张的时候,后台我就不知道怎么处理了,作为后台我不知道前端传来几张

这是前端页面代码

<script type="text/javascript">
    // 图片上传demo
    jQuery(function() {
    var $ = jQuery,
        $list = $('#fileList'),
        // 优化retina, 在retina下这个值是2
        ratio = window.devicePixelRatio || 1,
        // 缩略图大小
        thumbnailWidth = 100 * ratio,
        thumbnailHeight = 100 * ratio,
        // Web Uploader实例
        uploader;
    // 初始化Web Uploader
    uploader = WebUploader.create({
        // 自动上传。
        auto: true,
        // swf文件路径
        swf:'../js/Uploader.swf',
        // 文件接收服务端
        server: 'http://localhost:8080/testFileload/testup.do',
        //可上传的文件数量
        fileNumLimit: 11,
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: '#filePicker',
		
		sendAsBinary:true,
		
		fileVal:'filetoup',
		
        // 只允许选择文件,可选。
        accept: {
            title: 'Images',
            extensions: 'gif,jpg,jpeg,bmp,png',
            mimeTypes: 'image/*'
        }
    });

    // 当有文件添加进来的时候
    uploader.on( 'fileQueued', function( file ) {
        var $li = $(
                '<div id="' + file.id + '" class="file-item thumbnail">' +
                    '<img>' +
                    '<div class="info">' + file.name + '</div>' +
                '</div>'
                ),
            $img = $li.find('img');
        $list.append( $li );
        // 创建缩略图
        uploader.makeThumb( file, function( error, src ) {
            if ( error ) {
                $img.replaceWith('<span>不能预览</span>');
                return;
            }

            $img.attr( 'src', src );
        }, thumbnailWidth, thumbnailHeight );
    });

    // 文件上传过程中创建进度条实时显示。
    uploader.on( 'uploadProgress', function( file, percentage ) {
        var $li = $( '#'+file.id ),
            $percent = $li.find('.progress span');

        // 避免重复创建
        if ( !$percent.length ) {
            $percent = $('<p class="progress"><span></span></p>')
                    .appendTo( $li )
                    .find('span');
        }

        $percent.css( 'width', percentage * 100 + '%' );
    });

    // 文件上传成功,给item添加成功class, 用样式标记上传成功。
    uploader.on( 'uploadSuccess', function( file ) {
        $( '#'+file.id ).addClass('upload-state-done');
    });

    // 文件上传失败,现实上传出错。
    uploader.on( 'uploadError', function( file ) {
        var $li = $( '#'+file.id ),
            $error = $li.find('div.error');

        // 避免重复创建
        if ( !$error.length ) {
            $error = $('<div class="error"></div>').appendTo( $li );
        }

        $error.text('上传失败');
    });

    // 完成上传完了,成功或者失败,先删除进度条。
    uploader.on( 'uploadComplete', function( file ) {
        $( '#'+file.id ).find('.progress').remove();
    });
    //上传检查
    uploader.on('error', function(handler) {
		if(handler=="Q_EXCEED_NUM_LIMIT"){
			alert("超出最大张数");
		}
		if(handler=="F_DUPLICATE"){
			alert("文件重复");
		}
	});
});
    </script>
  </head>
  
  <body>
  	<div id="uploader-demo">
    	<!--用来存放item-->
    	<div id="fileList" class="uploader-list"></div>
    	<div id="filePicker">选择图片</div>
	</div>
  </body>
</html>



这是后台代码

@Controller
public class Upload {
	
	@RequestMapping("/testup.do")
	public ModelAndView testup(HttpServletRequest filetoup) throws IOException{
		FileOutputStream fos = null;
		Properties props = new Properties();
    	try {
    		//脑洞大开,用properties文件控制循环次数,这不重要,可忽略
			props.load(DirMaker.class.getClassLoader().getResourceAsStream("config.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
    	//为了存放新建的file
    	List<File> list = new ArrayList<File>();
    	List<String> listPicPath = new ArrayList<String>();
//    	Integer.parseInt(props.getProperty("createPicNum"))
		try {
			for (int i = 0; i <11; i++) {
				//上传的图片的命名有规范,所以这里是日期加UUID,这也不不是问题关键,忽略
				File f = new File("/" + DirMaker.refFormatNowDate() + "/"
						+ DirMaker.refFormatNowDate()
						+ UUID.randomUUID().toString().replaceAll("-", "")
						+ ".jpg");
				list.add(f);
				fos = new FileOutputStream(list.get(i));
				//这里封装了输入流转化为byte的方法
				byte[] data = ToByte.toByteArray(filetoup.getInputStream());
				fos.write(data);
				fos.flush();
				//为了把每个上传的图片的路径放到list里面
				listPicPath.add(list.get(i).getAbsolutePath());
			}
		} catch (Exception e) {
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		}
		ModelAndView mav = new ModelAndView("success");
		//需要返回图片的路径给前端
		mav.addObject("backdata", listPicPath);
		return mav;
	}
}



单张图片我这里完全可以解决,也能运行成功,多张的时候只保存了最后那张上传的,其他都没存到,困扰我的是我如何知道webuploader传到后台有几张图片呢,后台怎么处理webuploader一次性上传的多张图片。刚学这方面,很多地方不是特别懂,望各位大牛海涵,小弟在此谢谢各位大牛了

加载中
0
studyforjava
studyforjava

自己傻逼了,本来就不存在说一次性上传多个文件会有问题的情况,其实就是webuploader如果是一次性上传多个,它还是按照一个一个上传,不会一下子全交给后台,后台处理也是当作前端传来一个文件去处理,所以代码回退到能上传一个的情况,自然解决了一次性上传多个。

但是重要的一点,我这样写的代码是事先生成文件,我使用了UUID,也就是你传几个我生成几个不同的,不会存在只生成一个,如果创建File那一直是生成同一个文件,那么多上传会被覆盖,造成无论上传几个文件,最终只有一个,当然我这话好像有点废,共勉,我也是新手,刚学,感谢楼上大牛稍作指导,谢谢

后台代码

@Controller
public class Upload {
	@RequestMapping("/testup.do")
	public ModelAndView testup(HttpServletRequest filetoup) throws IOException{
		FileOutputStream fos = null;
		List<String> listPicPath = new ArrayList<String>();
		try {
			File f = new File("D:/" + DirMaker.refFormatNowDate() + "/"
					+ DirMaker.refFormatNowDate()
					+ UUID.randomUUID().toString().replaceAll("-", "") + ".jpg");
			DirMaker.createFile(f);
			fos = new FileOutputStream(f);
			// 这里封装了输入流转化为byte的方法
			byte[] data = ToByte.toByteArray(filetoup.getInputStream());
			fos.write(data);
			fos.flush();
			// 为了把每个上传的图片的路径放到list里面
			listPicPath.add(f.getAbsolutePath());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		}
		ModelAndView mav = new ModelAndView("success");
		// 需要返回图片的路径给前端
		mav.addObject("backdata", listPicPath);
		return mav;
	}
}



0
xpbob
xpbob
如果你前端的名字都是一样的,直接参数用CommonsMultipartFile[]
返回顶部
顶部