java通过url下载文件到指定目录(处理url中的空格、中文名)

  • 前言
    现项目需要写个方法下载url文件到指定路径,这里需要特别注意,要处理url中含中文和空格的情况,不然会有400错误。如http://192.168.0.22:8203/system/statics/answer/答案 附件.zip,其中包含空格、中文。
  • 代码
public static void  downLoadByUrl(String urlStr,String savePath) {
        try {
            // 编码处理空格、中文
            String encodeUrl = URLEncoder.encode(urlStr, "utf-8").replaceAll("\\+", "%20");
            // 由于整个url被编码,需要将冒号,斜杠进行还原
            encodeUrl = encodeUrl.replaceAll("%3A", ":").replaceAll("%2F", "/");
            String fileName = getFileName(urlStr);
            URL url = new URL(encodeUrl);

            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            //设置超时间为5秒
            conn.setConnectTimeout(5*1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //得到输入流
            InputStream inputStream = conn.getInputStream();
            //获取自己数组
            byte[] getData = readInputStream(inputStream);
            //文件保存位置
            File saveDir = new File(savePath);
            if(!saveDir.exists()){ // 没有就创建该文件
                saveDir.mkdir();
            }
            File file = new File(saveDir+File.separator+fileName);
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(getData);
            fos.close();
            inputStream.close();
            System.out.println("the file: "+url+" download success");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static  byte[] readInputStream(InputStream inputStream) throws IOException {
        byte[] buffer = new byte[4*1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while((len = inputStream.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        bos.close();
        return bos.toByteArray();
    }
    public static String getFileName(String srcRealPath){
        return StringUtils.substringAfterLast(srcRealPath,"/");
    }

至于将文件压缩成zip,可用hutools完成

你可能感兴趣的:(java,开发语言)