精华内容
下载资源
问答
  • Java一次下载多个文件

    千次阅读 2019-09-12 15:46:08
    最近项目遇到个需求,需要一次性导出全部数据-,而且是按照500条数据一个文件。 话不说,开始。 新增Excel工具类 可以直接复制 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util....

    最近项目遇到一个需求,需要一次性导出全部数据-,而且是按照500条数据一个文件。
    话不多说,开始。

    新增Excel工具类

    可以直接复制

    
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.util.CellRangeAddress;
    //关于下面这两个包,可以直接用Java自带的,也可以导入
    //我这里是导入的,可以进行一个编码的设置,不过我是没有设置成功,反而乱码
    //建议里面的文件名什么的都用英文,不用担心乱码,哈哈
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipOutputStream;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ExportExcel {
    
        // 显示的导出表的标题
        private String title;
        // 导出表的列名
        private String[] rowName;
        private List<Object[]> dataList = new ArrayList<Object[]>();
    
        public ExportExcel() {
        }
    
        // 构造函数,传入要导出的数据
        public ExportExcel(String title, String[] rowName, List<Object[]> dataList) {
            this.dataList = dataList;
            this.rowName = rowName;
            this.title = title;
        }
    
        // 导出数据
        public void export(OutputStream out) throws Exception {
            try {
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.createSheet(title);
    
                // 产生表格标题行
                HSSFRow rowm = sheet.createRow(0);
                HSSFCell cellTitle = rowm.createCell(0);
    
    
                //sheet样式定义【】
                HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);
                HSSFCellStyle style = this.getStyle(workbook);
                sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));
                cellTitle.setCellStyle(columnTopStyle);
                cellTitle.setCellValue(title);
    
                // 定义所需列数
                int columnNum = rowName.length;
                HSSFRow rowRowName = sheet.createRow(2);
    
                // 将列头设置到sheet的单元格中
                for (int n = 0; n < columnNum; n++) {
                    HSSFCell cellRowName = rowRowName.createCell(n);
                    cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
                    HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
                    cellRowName.setCellValue(text);
                    cellRowName.setCellStyle(columnTopStyle);
    
                }
                // 将查询到的数据设置到sheet对应的单元格中
                for (int i = 0; i < dataList.size(); i++) {
                    Object[] obj = dataList.get(i);// 遍历每个对象
                    HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数
    
                    for (int j = 0; j < obj.length; j++) {
                        HSSFCell cell = null;
                        //这几行被注释掉的代码,是给表格第一列进行一个赋值起一个编号的效果,不过我认为没必要
    //                    if (j == 0) {
    //                        cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC);
    //                        cell.setCellValue(i + 1);
    //                    } else {
                            cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
                            if (!"".equals(obj[j]) && obj[j] != null) {
                                cell.setCellValue(obj[j].toString());
                            }
    //                    }
                        cell.setCellStyle(style);
    
                    }
    
                }
    
                // 让列宽随着导出的列长自动适应
                for (int colNum = 0; colNum < columnNum; colNum++) {
                    int columnWidth = sheet.getColumnWidth(colNum) / 256;
                    for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                        HSSFRow currentRow;
                        if (sheet.getRow(rowNum) == null) {
                            currentRow = sheet.createRow(rowNum);
                        } else {
                            currentRow = sheet.getRow(rowNum);
                        }
                        if (currentRow.getCell(colNum) != null) {
                            HSSFCell currentCell = currentRow.getCell(colNum);
                            if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                                int length = currentCell.getStringCellValue().getBytes().length;
                                if (columnWidth < length) {
                                    columnWidth = length;
                                }
                            }
                        }
                    }
                    if (colNum == 0) {
                        sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
                    } else {
                        sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
                    }
                }
    
                if (workbook != null) {
                    try {
    
                        workbook.write(out);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
            } catch (Exception e) {
    
            }
    
    
        }
    
        /**
                * 列头单元格样式
       */
        public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
            // 设置字体
            HSSFFont font = workbook.createFont();
    
            // 设置字体大小
            font.setFontHeightInPoints((short) 11);
            // 字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置低边框
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            // 设置低边框颜色
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            // 设置右边框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            // 设置顶边框
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 设置顶边框颜色
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 在样式中应用设置的字体
            style.setFont(font);
            // 设置自动换行
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
    
        }
    
        public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
            // 设置字体
            HSSFFont font = workbook.createFont();
            // 设置字体大小
            font.setFontHeightInPoints((short) 10);
            // 字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式;
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置底边框;
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            // 设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            // 设置左边框;
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            // 设置左边框颜色;
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            // 设置右边框;
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            // 设置右边框颜色;
            style.setRightBorderColor(HSSFColor.BLACK.index);
            // 设置顶边框;
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置顶边框颜色;
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 在样式用应用设置的字体;
            style.setFont(font);
            // 设置自动换行;
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
        }
    
        //压缩文件
        public void ZipFiles(File[] srcfile, File zipfile) {
            ZipOutputStream out = null;
    
            byte[] buf = new byte[1024];
            try {
                out = new ZipOutputStream(new FileOutputStream(
                        zipfile));
    //            out.setEncoding("UTF-8");
                for (int i = 0; i < srcfile.length; i++) {
                    FileInputStream in = new FileInputStream(srcfile[i]);
                    out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    out.closeEntry();
                    in.close();
                }
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /***
         * 删除指定文件夹下所有文件
         *
         * @param path 文件夹完整绝对路径
         * @return
         */
        public static boolean delAllFile(String path) {
            boolean flag = false;
            File file = new File(path);
            if (!file.exists()) {
                return flag;
            }
            if (!file.isDirectory()) {
                return flag;
            }
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
                if (path.endsWith(File.separator)) {
                    temp = new File(path + tempList[i]);
                } else {
                    temp = new File(path + File.separator + tempList[i]);
                }
                if (temp.isFile()) {
                    temp.delete();
                }
                if (temp.isDirectory()) {
                    delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
                    flag = true;
                }
            }
            return flag;
        }
    
    }
    
    

    具体业务代码

    注:
    1、对数据预处理

     		String title = "业主信息表";//这个是表格的标题,不是文件名
     		//每个单元格的标题,具体内容自己设置
            String[] rowsName = {"业主id", "姓名","身份证号","楼栋号", "单元号", "楼层号", "房间号", "电话号码"};
            //存放需要的数据
            ArrayList<Object[]> dataList = new ArrayList<>();
            Object[] objs = null;
            //根据业务需求,查询出要导出的数据
            List<CitRoomMaster> list = citRoomMasterService.getList();
            //将全部数据按需加载到dataList中
            //对null值进行一个处理,因为如果是空的导入文件中会造成整个文件损坏,读取不到任何数据
            for (CitRoomMaster c :list) {
                objs = new Object[rowsName.length];
                objs[0] = c.getId();
                objs[1] = c.getUsername() == null?"未录入":c.getUsername();
                objs[2] = c.getIdCard() == null?"未录入":c.getIdCard();
                objs[3] = c.getBuilding() == null?"未录入":c.getBuilding();
                objs[4] = c.getUnit() == null?"未录入":c.getUnit();
                objs[5] = c.getRoomLevel() == null?"未录入":c.getRoomLevel();
                objs[6] = c.getRoomNum() == null?"未录入":c.getRoomNum();
                objs[7] = c.getTel() == null?"未录入":c.getTel();
                dataList.add(objs);
            }
    

    2、按500条数据进行Excel文件生成

    // 将excel导出的文件位置,临时文件,注意,一定是一个不存在的文件,因为后面会把这个文件夹删完
            String filePath = "C:\\小区业主信息"+ File.separator;
            // 得到此路径下文件
            File fileDir = new File(filePath);
            //创建文件夹
            if (!fileDir.exists() && !fileDir.isDirectory()) {
                fileDir.mkdirs();
            }
            // 用于存放生成的excel文件名称
            List<String> fileNames = new ArrayList<String>();
            // 导出Excel文件的路径
            String fullFilePath = "";
            //输出流
            FileOutputStream os = null;
    //拿到整个需要循环导出的次数
            int length = list.size()%500 == 0 ? list.size()/500 : (list.size()/500)+1;
            for (int i = 0; i < length; i++) {
                //给文件命名。随机命名 自定义
                String fileName = "OwnerInformation-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
    //生成Excel文件导出的路径
                fullFilePath = filePath + File.separator + fileName;
                fileNames.add(fullFilePath);
                os = new FileOutputStream(fullFilePath);
                //调用poi的工具类
                int end = 0;
                //对list进行截取,每500条数据
                ExportExcel ex = new ExportExcel(title, rowsName, dataList.subList(i*500,end = (i+1)*500<=list.size()?(i+1)*500:list.size()));
                try {
                    ex.export(os);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                os.flush();
                os.close();
                os = null;
            }
    

    3、将存放Excel的文件夹压缩导出,就完成需求了

    //告诉浏览器数据格式,将头和数据传到前台
            String headStr = "attachment; filename=\"" + zip.getName() + "\"";
            response.setContentType("APPLICATION/zip");
    //        response.setHeader("Location",zip.getName());
            response.setHeader("Content-Disposition", headStr);
            OutputStream out = response.getOutputStream();
            InputStream in = new FileInputStream(zipFilePath);
            byte[] buffer = new byte[1024];
            int i = -1;
            while ((i = in.read(buffer)) != -1) {
                out.write(buffer, 0, i);
            }
            out.flush();
            out.close();
            in.close();
            out = null;
            try {
                excelUtil.delAllFile(filePath); // 删除完里面所有内容
                filePath = filePath.toString();
                java.io.File myFilePath = new java.io.File(filePath);
                myFilePath.delete(); // 删除空文件夹
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    最后再说一点,还是关于中文乱码的问题,本来最开始的我是用的中文写文件名,并且在自己电脑上测试的时候是么有乱码的。但是部署到公司服务器上,就乱码了,怀疑是编码不一致问题导致的,因为时间问题,也没有去调试了。所以,如果有小伙伴能够解决这个问题,希望不吝赐教。

    展开全文
  • JAVA 如何一次下载多个文件

    万次阅读 2016-11-17 17:16:01
    https://zhidao.baidu.com/question/1446055057527183940.html import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j

    https://zhidao.baidu.com/question/1446055057527183940.html


    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.util.Vector;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
     
    /**
     * 本例使用的是基于JDK HttpURLConnection的同步下载,即按顺序下载
     * 如果同时下载多个任务,可以使用多线程
     * @author aK1ng
     *
     */
    public class Demo1 {
        public static void main(String[] args) {
            // 下载列表
            Vector<String> downloadList = new Vector<String>();
            // 添加下载地址
            downloadList.add("
    );
            downloadList.add("
    );
            download(downloadList);
        }
         
        /**
         * 下载
         */
        static void download(Vector<String> downloadList){
            // 线程池
            ExecutorService pool = null;
            HttpURLConnection connection = null;
            //循环下载
            try {
                for (int i = 0; i < downloadList.size(); i++) {
                    pool = Executors.newCachedThreadPool();
                    final String url = downloadList.get(i);
                    String filename = getFilename(downloadList.get(i));
                    System.out.println("正在下载第" + (i+1) + "个文件,地址:" + url);
                    Future<HttpURLConnection> future = pool.submit(new Callable<HttpURLConnection>(){
                        @Override
                        public HttpURLConnection call() throws Exception {
                            HttpURLConnection connection = null;
                            connection = (HttpURLConnection) new URL(url).openConnection(); 
                            connection.setConnectTimeout(10000);//连接超时时间
                            connection.setReadTimeout(10000);// 读取超时时间
                            connection.setDoInput(true);
                            connection.setDoOutput(true);
                            connection.setRequestMethod("GET");
                            //断点续连,每次要算出range的范围,请参考Http 1.1协议
                            //connection.setRequestProperty("Range", "bytes=0");
                            connection.connect();
                            return connection;
                        }
                    });
                    connection = future.get();
                    System.out.println("下载完成.响应码:"+ connection.getResponseCode());
                    // 写入文件
                    writeFile(new BufferedInputStream(connection.getInputStream()), URLDecoder.decode(filename,"UTF-8"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != connection)
                    connection.disconnect();
                if (null != pool) 
                    pool.shutdown();
            }
        }
         
        /**
         * 通过截取URL地址获得文件名
         * 注意:还有一种下载地址是没有文件后缀的,这个需要通过响应头中的
         * Content-Disposition字段 获得filename,一般格式为:"attachment; filename=\xxx.exe\"
         * @param url
         * @return
         */
        static String getFilename(String url){
            return ("".equals(url) || null == url) ? "" : url.substring(url.lastIndexOf("/") + 1,url.length());
        }
         
        /**
         * 写入文件
         * @param inputStream
         */
        static void writeFile(BufferedInputStream bufferedInputStream,String filename){
            //创建本地文件
            File destfileFile = new File("d:\\temp\\download\\"+ filename);
            if (destfileFile.exists()) {
                destfileFile.delete();
            }
            if (!destfileFile.getParentFile().exists()) {
                destfileFile.getParentFile().mkdir();
            }
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream = new FileOutputStream(destfileFile);
                byte[] b = new byte[1024];
                int len = 0;
                // 写入文件
                System.out.println("开始写入本地文件.");
                while ((len = bufferedInputStream.read(b, 0, b.length)) != -1) {
                    System.out.println("正在写入字节:" + len);
                    fileOutputStream.write(b, 0, len);
                }
                System.out.println("写入本地文件完成.");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != fileOutputStream) {
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    }
                    if (null != bufferedInputStream)
                        bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    展开全文
  • java 如何一次导出多个 excel 或者 pdf 文件
  • 一个问题(多文件多次请求):使用layui上传多文件的js源码是在upload.js中,当然果如你使用的是layui.all.js,那这上传文件的代码是在layui.all.js文件里。直接讲最关键的上传部分源码就好,layui的做法是使用...

    前言就不多说了,直接言归正传!!!

    •  第一个问题(多文件多次请求):使用layui上传多文件的js源码是在upload.js中,当然果如你使用的是layui.all.js,那这个上传文件的代码是在layui.all.js文件里。直接讲最关键的上传部分源码就好,layui的做法是使用layui.each()遍历文件队列依次发送Ajax(post,默认使用异步)请求到后台的。
    • 解决方法(多文件一次请求):看懂的关键部分,要想一次请求携带所有文件,先所有文件遍历放在同一个FormData中,最后最后在发送一次Ajax请求。当然这样虽然可以做到一次上传所有文件,但是对应的上传成功或失败后修改每个文件的状态还没做好,所有还得添加几行代码,稍见下方代码

    1. 源代码
    // 使用layui.all.js 中的代码示范(格式化后 lines=4323 or search=请求上传接口出现异常)
    layui.each(a, function (e, a) {
                    var r = new FormData;
                    r.append(l.field, a), layui.each(l.data, function (e, i) {
                        i = "function" == typeof i ? i() : i, r.append(e, i)
                    }), i.ajax({
                        url: l.url,
                        type: "post",
                        data: r,
                        contentType: !1,
                        processData: !1,
                        dataType: "json",
                        headers: l.headers || {},
                        success: function (i) {
                            t++, d(e, i), u()
                        },
                        error: function () {
                            n++, o.msg("请求上传接口出现异常"), m(e), u()
                        }
                    })
                })
    1. 修改后的代码
     //self  begin(合并资源上传)
                    var r_my = new FormData;
                    var e1 = '';//每个文件的标识,为修改文件状态准备
                    layui.each(a, function (e, a) {
                        e1 = e1 + (e + '&');
                        r_my.append(l.field, a)
                    })
                    layui.each(l.data, function (e1, i) {
                        i = "function" == typeof i ? i() : i, r_my.append(e1, i)
                    })
                    i.ajax({
                        url: l.url,
                        type: "post",
                        data: r_my,
                        contentType: !1,
                        processData: !1,
                        dataType: "json",
                        headers: l.headers || {},
                        success: function (i) {
                            var arr = e1.split('&');//遍历每个文件唯一标识修改状态
                            for (var j = 0; j < arr.length - 1; j++) {
                                t++, d(arr[j], i), u()
                            }
                        },
                        error: function () {
                            var arr = e1.split('&');
                            for (var j = 0; j < arr.length - 1; j++) {
                                n++, o.msg("请求上传接口出现异常"), m(arr[j]), u()
                            }
                        }
                    })

    以上呢,就基本满足各位的需求了,但是,可能还有其它的地方影响到,没有发现(每个文件的其它操作),毕竟人家写了一堆都是针对单个文件的,所以如果大家发现有什么问题或者修改好了的,欢迎在评论区发出,以便后来人参考

    • 第二个问题(Java后台控制器类的写法):这里用的是springMVC中MultipartResolver处理文件上传;另外在Ctl中因为前端用的是layui的,而layui原本是单个文件上传(r_my.append(l.field, a)),所以在Ctl参数接收用  !!!"file" !!!【可以在js和java参数中,修改为字符串‘files’,有兴趣修改试试】
      @RequestParam("file") MultipartFile[] files
    1. 部分配置文件
    <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->    
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    		<property name="defaultEncoding" value="UTF-8"/>    
    		<!-- 指定所上传文件的总大小不能超过10MB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
    		<property name="maxUploadSize" value="10485760"/>   
    	</bean>
    1. 浏览器&控制器Ctl

        @RequestMapping(value = "/uploadZfzl")
        @ResponseBody
        public String uploadZfzl(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception {
            String result = "上传失败";
            IFService fService = new IFServiceImpl();
            if (null != files && files.length > 0) {
                String curPageFileId = request.getParameter("curPageFileId");
    
                Map<String, Object> fileMap = new HashMap<>();
                List<DzdaDto> fileDtoList = new ArrayList<>();
                for (MultipartFile file : files) {
                    String entryName = file.getOriginalFilename();
                    String indexName = entryName.substring(entryName.lastIndexOf(".") + 1);
                    if ("jpg".equalsIgnoreCase(indexName) || "png".equalsIgnoreCase(indexName) || "pdf".equalsIgnoreCase(indexName)) {//jpg,png,pdf
                        byte[] fileBytes = file.getBytes();
                        DzdaDto fileDto = new DzdaDto();
                        fileDto.setFileType(indexName);
                        fileDto.setFileName(entryName);
                        fileDto.setFileContent(fileBytes);
                        fileDto.setWjlxDm("03");
                        fileDtoList.add(fileDto);
                    }
                }
                fileMap.put("curPageFileId", curPageFileId);
                fileMap.put("fileDtoList", fileDtoList);
                try {
                    fService .uploadZfzl(fileMap);
                    result = "上传成功";
                } catch (Exception e) {
                    log.error("上传失败!", e);
                    result = "上传失败";
                }
    
            }
            return result;
        }
    • 第三个问题(上传数量限制):使用layui虽然能限制,但是只是限制所有未上传文件的数量,假设限制4,如果先上传3个成功,在选择3个,并上传是允许的。可能就不是想要的效果,所有文件总数的限制了。马上贴出js代码
    1. js控制列表数代码(ps:return结束不了代码执行上传操作,所以使用报错方式结束[至少我的电脑是这样的],另外不要想着在choose:{}里面判断,很复杂,虽然可能更加人性化,截图看看)
    , before: function (obj) { //choose 回调之后、done/error 回调之前触发
        var fileTableNum = $('#fbzlPre tr').length;
        if (fileTableNum > 4) {
        layer.alert('请检查附报资料的数量', {icon: 2, skin: 'layer-ext-moon'});
            die;//无法return,使用报错结束上传
            // return;
         }
      }

    • 第四个问题(多次请求多线程问题):最后一个问题,得看个人是怎么处理或者多次请求的上传文件是什么操作了,如果仍然使用layui多个文件多次请求,那么到后台就是多个线程在处理;如果不是单纯的保存文件,而是保存后,对返回的数据再次处理;可能涉及到线程安全问题;可以这样解决
    1. 第一:在Java代码通加锁或者同步代码块
    2. 第二:还是把前端js源码修改,加个同步就好;
    3. 就不贴代码了;有问题欢迎留言讨论

     

     

     

     

    展开全文
  • package ... import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLC...
    package com.acconsys.base.util;
    
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Map;
    public class HttpRequester {
        private static final String BOUNDARY = "-------45962402127348";
        private static final String FILE_ENCTYPE = "multipart/form-data";
    public static void main(String[] args) {
    	String filepath = "D:\\360安全浏览器下载\\plsqldev_2990.zip";
    	String urlStr = "http://localhost:8080/chsService/FileUploadServlet";
    	Map<String, String> textMap = new HashMap<String, String>();
    	textMap.put("hahaha", "Capital-DocGen.zip");
    	textMap.put("aaa", "D:\\server.zip");
    	textMap.put("bbbb", "<?xml version='1.0' encoding='utf-8'?><root><parts><part number='设计Name' name='设计ShortDescription'  projectName='项目名'  version='设计版本' owner='设计创建人' type='设计类型' domain='所属域Name' status='设计状态'></part><part number='设计Name' name='设计ShortDescription'  projectName='项目名'  version='设计版本' owner='设计创建人' type='设计类型' domain='所属域Name' status='设计状态'></part><part number='设计Name' name='设计ShortDescription'  projectName='项目名'  version='设计版本' owner='设计创建人' type='设计类型' domain='所属域Name' status='设计状态'></part></parts></root>");
    	Map<String, File> fileMap = new HashMap<String, File>();
    	fileMap.put("myFile.zip", new File(filepath));
    	post(urlStr, textMap, fileMap);
    
    }
    /**
     * 
     * @param urlStr http请求路径
     * @param params 请求参数
     * @param images 上传文件
     * @return
     */
        public static InputStream post(String urlStr, Map<String, String> params,
                Map<String, File> images) {
            InputStream is = null;
            
            try {
                URL url = new URL(urlStr);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
    
                con.setConnectTimeout(5000);
                con.setDoInput(true);
                con.setDoOutput(true);
                con.setUseCaches(false);
                con.setRequestMethod("POST");
                con.setRequestProperty("Connection", "Keep-Alive");
                con.setRequestProperty("Charset", "UTF-8");
                con.setRequestProperty("Content-Type", FILE_ENCTYPE + "; boundary="
                        + BOUNDARY);
                
                StringBuilder sb = null;
                DataOutputStream dos = new DataOutputStream(con.getOutputStream());;
                if (params != null) {
                    sb = new StringBuilder();
                    for (String s : params.keySet()) {
                        sb.append("--");
                        sb.append(BOUNDARY);
                        sb.append("\r\n");
                        sb.append("Content-Disposition: form-data; name=\"");
                        sb.append(s);
                        sb.append("\"\r\n\r\n");
                        sb.append(params.get(s));
                        sb.append("\r\n");
                    }
        
                    dos.write(sb.toString().getBytes());
                }
    
                if (images != null) {
                    for (String s : images.keySet()) {
                        File f = images.get(s);
                        sb = new StringBuilder();
                        sb.append("--");
                        sb.append(BOUNDARY);
                        sb.append("\r\n");
                        sb.append("Content-Disposition: form-data; name=\"");
                        sb.append(s);
                        sb.append("\"; filename=\"");
                        sb.append(f.getName());
                        sb.append("\"\r\n");
                        sb.append("Content-Type: application/zip");//这里注意!如果上传的不是图片,要在这里改文件格式,比如txt文件,这里应该是text/plain
                        sb.append("\r\n\r\n");
                        dos.write(sb.toString().getBytes());
        
                        FileInputStream fis = new FileInputStream(f);
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = fis.read(buffer)) != -1) {
                            dos.write(buffer, 0, len);
                        }
                        dos.write("\r\n".getBytes());
                        fis.close();
                    }
        
                    sb = new StringBuilder();
                    sb.append("--");
                    sb.append(BOUNDARY);
                    sb.append("--\r\n");
                    dos.write(sb.toString().getBytes());
                }
                dos.flush();
    
                if (con.getResponseCode() == 200)
                    is = con.getInputStream();
                
                dos.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return is;
        }
    }

     

    展开全文
  • package ... import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import jav...
  • JAVA项目同时上传多个文件和多个内容   首先这俩问题是由个功能引发的,最近项目中有这样的要求,前端要上传多个文件用于地图描绘那些东西,但只是为了拼到地图上查看一下,并不做保存,这就引发了我的纠结,...
  • 最近公司有需求,需要点击一个按钮生成二维码,然后把二维码打包成zip文件,然后下载zip文件,于是我做了demo,这里分享一下。 文件下载不能异步请求,因为我需要url后面动态拼接参数,所以这里用了button,具体...
  • 文件传送 服务端 FileServer import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class FileServer { ...
  • 1、下载单个文件 public JsonView downPrintFile(){ //要下载的文件名 从前台传来 String fileNameNeedDown = request.getParameter("fileName"); //这里的路径是要下载文件所在路径 String ...
  • java后台发起上传文件的post请求(http和https)

    万次阅读 多人点赞 2019-07-31 19:11:04
    对于文件上传,客户端通常就是页面,在页面里实现上传文件不是什么难事,写form,加上enctype="multipart/form-data",在写接收的就可以了,没什么难的。如: <!DOCTYPEhtml> <html> <head> ...
  • 因为是接口的原因,需要json数据来表示一些键值关系,然后接口还需要上传一个音频文件。怎么能在同一HTTP请求中完成这两种数据传输呢。或者说怎么让两者共存呢,如果把文件转成字符串然后加如json数据中,json数据...
  • Java实现上传(支持多个文件同时上传)和下载

    万次阅读 多人点赞 2018-05-08 17:38:41
    文件上传一直是Web项目中必不可少的项功能。项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml1.先编写up.jsp&...
  • Java发送Post请求上传文件

    万次阅读 2017-08-27 17:06:41
    如果要想知道java同时上传多个文件和多个内容的步骤,请看我另篇文章JAVA上传多个文件和多个内容方法 1.JSP中相关代码 form id="uploadForm" enctype="multipart/form-data"> p >...
  • Java构建Request请求

    千次阅读 2019-09-10 14:08:15
    Java构建Request请求1. 两种方式构建request请求1.1. RestTemplate1.2. HttpPost2. 后台接受参数 前两天在做我们内部系统时,需要我们网腾讯平台上回传数据,当时给的接口是这样的 请求示例: curl -i ...
  • 一次提交,发起多次请求...而脚本方法又是通过JQ来选中表单控件,如果页面中有多个表单,而多个表单控件都被JQ选择器选中,那么就会出现一次提交发起多次请求的问题。 当然了这只是其中个可能的原因,可以参考一下。
  • java后台生成excel,前台发请求下载

    万次阅读 2018-01-04 14:21:19
    浏览器发送请求java后台,下载生成的excel文件
  • 运用 Java 8 写一个 HTTP 请求工具类

    千次阅读 2019-01-27 20:52:09
    三年以前写过一个 HTTP 请求类,然后又将其改进为链式风格的调用方式。虽然可以实现需求,基本上也没用重复的逻辑,但是编码上总是觉得怪怪的,当时也说不上哪里不对劲,尽管逻辑没错能实现,然而就是感觉谈不上...
  • HttpClient是Apache提供的一个用于在Java中处理HTTP请求、响应操作的工具,它比JDK中自带的URLConnection更加灵活好用,因此越来越的人开始使用它来实行对HTTP的请求操作。HttpClient的初级使用我是在IDEA的编译...
  • java导出多个excel,以压缩包下载

    千次阅读 热门讨论 2018-06-26 15:21:39
    2.如果一次需要导出多个excel,可以在本地生成多个excel,然后压缩成压缩包,然后下载压缩包; 步骤: 1.在本地创建个零时文件夹,将多个excel生成到该文件夹下; 2.将该文件夹压缩,导出; 3.将该文件夹删除; 上代码:...
  • 想要做的是:用for循环遍历出要下载的文件列表,用线程去下载个线程下载一个文件。 现在的问题是:线程A已经开始发起请求下载文件A,线程B会重新遍历for循环,又继续请求下载文件A,两个都重复了。
  • Java生成多个pdf文件,压缩包zip下载

    千次阅读 热门讨论 2019-06-06 19:09:04
    // 把excel拷贝到同个文件目录下 ZipUtil.createZip(newResPath, zipPath); // 打包改目录成.zip包 //下载 try (InputStream inputStream = new FileInputStream(new File(zipPath )); OutputStream outputStream =...
  • Java多线程下载文件实例

    千次阅读 2018-09-04 10:07:52
    import java.io.BufferedInputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.uti....
  • Java通过Http请求下载文本附件到本地

    千次阅读 2012-01-11 22:55:45
    //首先通过socket获取下载流InputStream is=socket.getInputStream();int lengt = 1024;//根据实际情况获得 final ByteArrayOutputStream baos = readLengthData(is,length);//读取未经解压的数据流final ...
  • 通常拿到第三方的接口文档的时候,不是第时间先写代码,而是详细阅读接口文档。若接口需要第三方提供的基本参数,例如signkey,secrect等,也可以是其他的,查看文档里是否提供。再用工具(postman、swagger)构建...
  • 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。 那么,问题来啦: java的服务是属于那种形式呢,怎么区分? 比如tomcat又是属于哪种呢? 首先,服务器的实现不止有这两...
  • Java面试题】一次完整的Http请求过程(非常详细)
  • java如何从https下载链接中下载文件

    千次阅读 2019-04-18 22:32:51
    导入安全证书到jdk下载文件URL 获取inputStreamSpring 的 restTemplate 方法发送请求完整案例: 从https 下载文件会存在什么用的问题? 普通的http下载非常的简单,无需做任何处理,可以直接用 URL.openStream获取.....
  • JAVA多个文件打包成ZIP压缩包输出

    千次阅读 2019-07-01 11:36:21
    工具类(将多个远端文件读取并压缩) import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import ...
  • 排除把多文件打包成zip后下载,有没有办法选中多个文件,同时进行下载

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 701,310
精华内容 280,524
关键字:

java一次请求下载多个文件

java 订阅