首页 > 编程语言 >java通过url得到文件对象(支持http和https)

java通过url得到文件对象(支持http和https)

时间:2023-04-25 16:00:53浏览次数:37  
标签:https java String url file new import

文字标题:java通过url得到文件对象(支持http和https)

作者:锅巴

1.场景:通过一个url地址来得到一个文件,此方式就是通过一个url将文件下载到本地的临时文件,直接上代码

    /**
     * 远程读取文件
     *
     * @param netUrl
     * @return
     */
    public static File getNetUrl(String netUrl) {
        //判断http和https
        File file = null;
        if (netUrl.startsWith("https://")) {
            file = getNetUrlHttps(netUrl);
        } else {
            file = getNetUrlHttp(netUrl);
        }
        return file;
    }

全部引用的包,工具类可能有其他引用,取自己所需的路径就好

2.getNetUrlHttp方法

这里创建的是本地临时文件,所以用完了之后,不用刻意调用file.delete方法进行删除

import com.guoba.util.X509TrustUtiil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
import javax.net.ssl.*;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.channels.FileChannel;
import java.util.*;

public static File getNetUrlHttp(String netUrl) {
        //对本地文件命名
        String fileName = StringUtils.reloadFile(netUrl);
        File file = null;
 
 
        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("net_url", fileName);
            //下载
            urlfile = new URL(netUrl);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);
 
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            log.error("远程图片获取错误:"+netUrl);
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }
 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        return file;
    }


getNetUrlHttps

这个方法就相对于要麻烦很多了,毕竟涉及到ssl,很多人再请求的时候绕不开ssl,这里可以通过代码进行处理

SSLContext不需要其他包,使用java自带的,无需import
/**
     * 下载文件到本地(支持https)
     *
     * @param fileUrl 远程地址
     * @throws Exception
     */
    public static File getNetUrlHttps(String fileUrl) {
        //对本地文件进行命名
        String file_name = StringUtils.reloadFile(fileUrl);
        File file = null;
 
        DataInputStream in = null;
        DataOutputStream out = null;
        try {
            file = File.createTempFile("net_url", file_name);
 
            SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE");
            sslcontext.init(null, new TrustManager[]{new X509TrustUtiil()}, new java.security.SecureRandom());
            URL url = new URL(fileUrl);
            HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslsession) {
                    logger.warn("WARNING: Hostname is not matched for cert.");
                    return true;
                }
            };
            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
            HttpsURLConnection urlCon = (HttpsURLConnection) url.openConnection();
            urlCon.setConnectTimeout(6000);
            urlCon.setReadTimeout(6000);
            int code = urlCon.getResponseCode();
            if (code != HttpURLConnection.HTTP_OK) {
                throw new Exception("文件读取失败");
            }
            // 读文件流
            in = new DataInputStream(urlCon.getInputStream());
            out = new DataOutputStream(new FileOutputStream(file));
            byte[] buffer = new byte[2048];
            int count = 0;
            while ((count = in.read(buffer)) > 0) {
                out.write(buffer, 0, count);
            }
            out.close();
            in.close();
        } catch (Exception e) {
            log.error("远程图片获取错误:"+fileUrl);
            e.printStackTrace();
        } finally {
            try {
                if (null != out) {
                    out.close();
                }
                if (null != in) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
 
        return file;
    }


工具类X509TrustUtiil

import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
 
public class X509TrustUtiil implements X509TrustManager {
 
	@Override
	public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public X509Certificate[] getAcceptedIssuers() {
		// TODO Auto-generated method stub
		return null;
	}
 
}

ps:最后放两个StringUtils工具类

/**
     * 重命名,UUIU
     *
     * @param oleFileName
     * @return
     */
    public static String reloadFile(String oleFileName) {
        oleFileName = getFileName(oleFileName);
        if (StringUtils.isEmpty(oleFileName)) {
            return oleFileName;
        }
        //得到后缀
        if (oleFileName.indexOf(".") == -1) {
            //对于没有后缀的文件,直接返回重命名
            return UniqId.getUid();
        }
        String[] arr = oleFileName.split("\\.");
        // 根据uuid重命名图片
        String fileName = UniqId.getUid() + "." + arr[arr.length - 1];
 
        return fileName;
    }
 
    /**
     * 把带路径的文件地址解析为真实文件名 /25h/upload/hc/1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4 解析为 1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4
     *
     * @param url
     */
    public static String getFileName(final String url) {
        if (StringUtils.isEmpty(url)) {
            return url;
        }
        String newUrl = url;
        newUrl = newUrl.split("[?]")[0];
        String[] bb = newUrl.split("/");
        String fileName = bb[bb.length - 1];
        return fileName;
    }

用好以上类【工具类】,就可以通过一个url将远程地址的文件转化为本地文件了(_)

标签:https,java,String,url,file,new,import
From: https://www.cnblogs.com/guobabiancheng/p/17352877.html

相关文章

  • java面试题--springboot
    一、SpringBoot自动装配原理是什么?@SpringBootApplication@EnableAutoConfigration\@SpringBootConfigration\@ComponentScan@AutoConfigrationPackage\@ImportMETA-INF\spring.factories二、说一下@Configuration中的属性proxyBeanMethods的作用?首先,引入两个概念:Full全......
  • Java中不同对象调用该实例方法返回值是同一个地址空间吗?
    结论不管是基本类型还是引用类型都是新开辟的内存空间即返回的不是同一个地址空间不然操作返回值A变量直接影响到返回值B变量'=='基本比较的是两者的值是否相同而引用类型比较两者的是引用地址是否相同基本类型返回的值相同'=='就为truepublicintm1(){ return-1;......
  • EAS_在ListUIETCX.java中校验是否选中行
    /***对内背书*/publicvoidactionEndorseIn_actionPerformed(ActionEvente)/**/throwsException/**/{checkSelected();ArrayListidList=getSelectedIdValues();ReceivableBillCollec......
  • java学习之七:使用匿名类直接new接口
    ......
  • Java学习之六:“this”和“类名.this”以及“类名.class”的区分和详解
    目录 目录引言:1.Class类介绍:1.1Class类简介:1.2得到类对象的三个方法:1.3Class类的常用方法:2.this关键词:3.类名.this:4.总结 引言:对于以上三个语法结构的区分,需要先理解Class类所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类......
  • Java学习之四:“this”和“类名.this”以及“类名.class”的区分和详解
    引言:对于以上三个语法结构的区分,需要先理解Class类所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类对象”,每个类的类对象是唯一且是不可变的。而在对象创建的时候,由于类对象已加载,所以可以添加上类型标签。1.Class类介绍:此类的介......
  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • JavaWeb回顾与小结(二)
    AjaxAjax介绍概念AsynchronousJavaScriptAndXML,异步的JS和XML作用数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术原生Ajax准备数据地址创建XMLHttpRequest对象:......
  • java把word文件流转为pdf并下载优化篇
    上一篇方法虽然能用,但是样式会乱,目录也会丢失。故搜集了多篇博客终于找到了优化版本不会丢失目录,也不会丢失任何东西,样式也能源文件保留首先这个需要下载一个jar包,链接已放自行下载链接:https://pan.baidu.com/s/1viRWwiEOdgLUwb9VxZb8RQ?pwd=m4xu 提取码:m4xu然后放在系统根目......
  • 【❀Java虚拟机】对象终止机制
    什么是对象终止机制?Java语言提供了对象终止( finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑处理。当垃圾回收器发现没有任何引用指向某个对象时,那么就会在垃圾回收中清除这个对象,在垃圾回收器回收此对象之前,会先调用这个对象的 finalize()方法。我们......