通过WebUpload上传zip文件并解压(用于批量上传照片等)

  • 前端

html

<div id="uploader" class="wu-example">
    <p class="text-danger">tip:请将照片统一命名为“学号+后缀名”(如16032051.jpg),照片格式为JPG/JPEG,将所有照片直接压缩打包zip文件后再上传。</p>
    <div id="thelist" class="uploader-list"></div>
    <div class="btns">
        <div id="picker">选择文件</div>
        <button id="ctlBtn" class="btn btn-info" >开始上传</button>
    </div>
</div>

js

var uploader = WebUploader.create({

            // 文件接收服务端。
            server: '/user/uploadPhoto',

            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick:{
                id:'#picker',
                multiple:false  //限制多文件上传
            },
            chunked: true,//开启分片上传
            dnd:"#drag_box",//设置可拖拽上传容器
            accept:{
                title: 'Zip',
                extensions: 'zip',
                mimeTypes: 'application/zip,application/x-zip,application/x-zip-compressed',
            },//设置文件类型限制
            fileNumLimit:1 //设置文件数量限制
        });

        $("#ctlBtn").on('click',function () {//开始上传
            uploader.upload();
        })

        //当有文件被选择上传时,因为只上传1个文件所以多次选择之前先清空之前的选择实现覆盖
        uploader.on('beforeFileQueued',function () {
            console.log("before")
            uploader.reset();
            $("#thelist").empty();
        });
        // 当有文件被添加进队列的时候
        uploader.on( 'fileQueued', function( file ) {
            console.log("add")
            $("#thelist").append( '<div id="' + file.id + '" class="item">' +
                '<h4 class="info">' + file.name + '</h4>' +
                '<p class="state">等待上传...</p>' +
                '</div>' );
        });
        // 文件上传过程中创建进度条实时显示。
        uploader.on( 'uploadProgress', function( file, percentage ) {
            var $li = $( '#'+file.id ),
                $percent = $li.find('.progress .progress-bar');

            // 避免重复创建
            if ( !$percent.length ) {
                $percent = $('<div class="progress progress-striped active">' +
                    '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                    '</div>' +
                    '</div>').appendTo( $li ).find('.progress-bar');
            }

            $li.find('p.state').text('上传中');

            $percent.css( 'width', percentage * 100 + '%' );
        });
        uploader.on( 'uploadSuccess', function( file ,data) {
            //data参数即为服务器响应数据
            if(data.code==1){
                $( '#'+file.id ).find('p.state').text('已上传');
            }else{
                $( '#'+file.id ).find('p.state').text(data.message);
            }
        });

        uploader.on( 'uploadError', function( file ) {
            $( '#'+file.id ).find('p.state').text('上传出错');
        });

        uploader.on( 'uploadComplete', function( file ) {
            $( '#'+file.id ).find('.progress').fadeOut();
        });
  • 后端java

pom添加zip

        <dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>1.3.2</version>
        </dependency>

 Controller

 /***
     * 批量上传照片zip
     * @return
     */
    @RequestMapping("uploadPhoto")
    public ResponseModel uploadPhoto(MultipartFile file){
        String path=NGINX_LOCATION+"/photo/";
        File saveFile = new File(path+System.currentTimeMillis()+".zip");
        if(!saveFile.getParentFile().exists()){
            saveFile.getParentFile().mkdirs();
        }
        try {
            file.transferTo(saveFile);
            ZipFile zipFile = new ZipFile(saveFile); //创建ZipFile
            zipFile.setFileNameCharset("UTF-8"); //防止乱码
            FileHeader fileHeader = (FileHeader) zipFile.getFileHeaders().get(0);//获取zip文件包内信息
            if(fileHeader.isDirectory()){//这里是我业务需要,判断是否解压出来直接为照片,而不包含文件夹,简单判断第一个文件是否为文件夹
                saveFile.delete();
                return ResponseModel.buildErrorUploadPhotoFormat();//返回zip内容错误
            }
            zipFile.extractAll(path);//将zip进行解压
            saveFile.delete();//删除zip
            return ResponseModel.buildOk();
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseModel.buildErrorUploadPhoto();
        } catch (ZipException e) {
            e.printStackTrace();
            return ResponseModel.buildErrorUploadPhoto();
        }

    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Java实现zip文件上传解压的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/upload") @MultipartConfig // 必须加上此注解才能处理文件上传 public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传文件 Part filePart = request.getPart("file"); // 获取文件名 String fileName = filePart.getSubmittedFileName(); // 获取文件输入流 FileInputStream fileInputStream = (FileInputStream) filePart.getInputStream(); // 创建目标文件 File targetFile = new File(fileName); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); // 将上传文件写入到目标文件中 byte[] buffer = new byte[1024]; int len; while ((len = fileInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, len); } fileInputStream.close(); fileOutputStream.close(); // 解压文件 unzip(targetFile); // 输出成功信息 response.getWriter().println("文件上传解压成功!"); } private void unzip(File zipFile) throws IOException { // 创建解压目录 String unzipDir = zipFile.getName().substring(0, zipFile.getName().lastIndexOf('.')); File unzipDirFile = new File(unzipDir); unzipDirFile.mkdirs(); // 创建ZipInputStream ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile)); // 循环读取ZipEntry ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { String entryName = zipEntry.getName(); String entryPath = unzipDir + File.separator + entryName; if (zipEntry.isDirectory()) { // 如果是目录,则创建目录 new File(entryPath).mkdirs(); } else { // 如果是文件,则写入文件 FileOutputStream fileOutputStream = new FileOutputStream(entryPath); byte[] buffer = new byte[1024]; int len; while ((len = zipInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, len); } fileOutputStream.close(); } zipEntry = zipInputStream.getNextEntry(); } zipInputStream.closeEntry(); zipInputStream.close(); } } ``` 该代码使用了Servlet 3.0规范的`@MultipartConfig`注解来处理文件上传,通过`request.getPart("file")`方法获取上传文件。然后将文件写入到目标文件中,并调用`unzip()`方法解压文件。`unzip()`方法使用`ZipInputStream`读取zip文件中的每个`ZipEntry`,如果是目录则创建目录,如果是文件则写入文件解压完成后,输出成功信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿S先森丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值