Java下http下载文件客户端和上传文件客户端实例代码

 更新时间:2017年12月01日 11:34:03   作者:chenyulancn  
这篇文章主要介绍了Java下http下载文件客户端和上传文件客户端实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

一、下载客户端代码

package javadownload; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
/** 
 * @说明 导出虚拟机 
 * @author wxt 
 * @version 1.0 
 * @since 
 */ 
public class GetVM { 
  /** 
   * 测试 
   * @param args 
   */ 
  public static void main(String[] args) { 
    String url = "http://192.168.5.102:8845/xx"; 
    byte[] btImg = getVMFromNetByUrl(url); 
    if(null != btImg && btImg.length > 0){ 
      System.out.println("读取到:" + btImg.length + " 字节"); 
      String fileName = "ygserver"; 
      writeImageToDisk(btImg, fileName); 
    }else{ 
      System.out.println("没有从该连接获得内容"); 
    } 
  } 
  /** 
   * 将vm 写入到磁盘 
   * @param vm 数据流 
   * @param fileName 文件保存时的名称 
   */ 
  public static void writeImageToDisk(byte[] vm, String fileName){ 
    try { 
      File file = new File("./" + fileName); 
      FileOutputStream fops = new FileOutputStream(file); 
      fops.write(vm); 
      fops.flush(); 
      fops.close(); 
      System.out.println("下载完成"); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 根据地址获得数据的字节流 
   * @param strUrl 网络连接地址 
   * @return 
   */ 
  public static byte[] getVMFromNetByUrl(String strUrl){ 
    try { 
      URL url = new URL(strUrl); 
      HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
      conn.setRequestMethod("GET"); 
      conn.setConnectTimeout(5 * 1000); 
      InputStream inStream = conn.getInputStream();//通过输入流获取数据 
      byte[] btImg = readInputStream(inStream);//得到的二进制数据 
      return btImg; 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return null; 
  } 
  /** 
   * 从输入流中获取数据 
   * @param inStream 输入流 
   * @return 
   * @throws Exception 
   */ 
  public static byte[] readInputStream(InputStream inStream) throws Exception{ 
    ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[1024]; 
    int len = 0; 
    while( (len=inStream.read(buffer)) != -1 ){ 
      outStream.write(buffer, 0, len); 
    } 
    inStream.close(); 
    return outStream.toByteArray(); 
  } 
} 

上述代码只适合下载小文件,如果下载大文件则会出现  Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 错误,所以如果下载大文件需要对上述代码进行改造,代码如下:

package javadownload; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
/** 
 * @说明 导出虚拟机 
 * @author wxt 
 * @version 1.0 
 * @since 
 */ 
public class GetBigFile { 
  /** 
   * 测试 
   * @param args 
   */ 
  public static void main(String[] args) { 
    String url = "http://192.168.5.76:8080/export?uuid=123"; 
    String fileName="yserver";  
    getVMFromNetByUrl(url,fileName); 
  } 
  /** 
   * 根据地址获下载文件 
   * @param strUrl 网络连接地址 
   * @param fileName 下载文件的存储名称 
   */ 
  public static void getVMFromNetByUrl(String strUrl,String fileName){ 
    try { 
      URL url = new URL(strUrl); 
      HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
      conn.setRequestMethod("GET"); 
      conn.setConnectTimeout(5 * 1000); 
      InputStream inStream = conn.getInputStream();//通过输入流获取数据 
      byte[] buffer = new byte[4096]; 
      int len = 0; 
      File file = new File("./" + fileName); 
      FileOutputStream fops = new FileOutputStream(file); 
      while( (len=inStream.read(buffer)) != -1 ){ 
        fops.write(buffer, 0, len); 
      } 
      fops.flush(); 
      fops.close();   
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
} 

二、上传文件客户端:

package javadownload; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
public class FileUpload { 
  /** 
   * 发送请求 
   * 
   * @param url 
   *      请求地址 
   * @param filePath 
   *      文件在服务器保存路径(这里是为了自己测试方便而写,可以将该参数去掉) 
   * @return 
   * @throws IOException 
   */ 
  public int send(String url, String filePath) throws IOException { 
    File file = new File(filePath); 
    if (!file.exists() || !file.isFile()) { 
      return -1; 
    } 
    /** 
     * 第一部分 
     */ 
    URL urlObj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); 
    /** 
     * 设置关键值 
     */ 
    con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式 
    con.setDoInput(true); 
    con.setDoOutput(true); 
    con.setUseCaches(false); // post方式不能使用缓存 
    // 设置请求头信息 
    con.setRequestProperty("Connection", "close");//Keep-Alive 
    con.setRequestProperty("Charset", "UTF-8"); 
    // 设置边界 
    String BOUNDARY = "----------" + System.currentTimeMillis(); 
    con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" 
        + BOUNDARY); 
    // 请求正文信息 
    // 第一部分: 
    StringBuilder sb = new StringBuilder(); 
    sb.append("--"); // ////////必须多两道线 
    sb.append(BOUNDARY); 
    sb.append("\r\n"); 
    sb.append("Content-Disposition: form-data;name=\"file_name\";filename=\"" 
        + file.getName() + "\"\r\n"); 
    sb.append("Content-Type:application/octet-stream\r\n\r\n"); 
    sb.append("Connection:close\r\n\r\n"); 
    byte[] head = sb.toString().getBytes("utf-8"); 
    // 获得输出流 
    OutputStream out = new DataOutputStream(con.getOutputStream()); 
    out.write(head); 
    // 文件正文部分 
    DataInputStream in = new DataInputStream(new FileInputStream(file)); 
    int bytes = 0; 
    byte[] bufferOut = new byte[1024]; 
    while ((bytes = in.read(bufferOut)) != -1) { 
      out.write(bufferOut, 0, bytes); 
    } 
    in.close(); 
    // 结尾部分 
    byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线 
    out.write(foot); 
    out.flush(); 
    out.close(); 
    /** 
     * 读取服务器响应,必须读取,否则提交不成功 
     */ 
    return con.getResponseCode(); 
    /** 
     * 下面的方式读取也是可以的 
     */ 
    // try { 
    // // 定义BufferedReader输入流来读取URL的响应 
    // BufferedReader reader = new BufferedReader(new InputStreamReader( 
    // con.getInputStream())); 
    // String line = null; 
    // while ((line = reader.readLine()) != null) { 
    // System.out.println(line); 
    // } 
    // } catch (Exception e) { 
    // System.out.println("发送POST请求出现异常!" + e); 
    // e.printStackTrace(); 
    // } 
  } 
  public static void main(String[] args) throws IOException { 
    FileUpload up = new FileUpload(); 
    System.out.println(up.send("http://192.168.5.102:8845/xx", 
        "./vif.xml")); 
    ; 
  } 
} 

总结

以上所述是小编给大家介绍的Java下http下载文件客户端和上传文件客户端实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java常用工具类 Date日期、Mail邮件工具类

    java常用工具类 Date日期、Mail邮件工具类

    这篇文章主要为大家详细介绍了java常用工具类,包括Date日期、Mail邮件工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • IDEA配置tomcat服务器全过程

    IDEA配置tomcat服务器全过程

    这篇文章主要介绍了IDEA配置tomcat服务器全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Mybatis-Plus通过SQL注入器实现批量插入的实践

    Mybatis-Plus通过SQL注入器实现批量插入的实践

    本文主要介绍了Mybatis-Plus通过SQL注入器实现批量插入的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 自己动手写的mybatis分页插件(极其简单好用)

    自己动手写的mybatis分页插件(极其简单好用)

    最近做了个项目,需要用到mybatis分页功能,网上找了很多插件,都不太合适,于是就自己动手写了个mybatis分页插件功能,非常不错,代码简单易懂,需要的朋友参考下吧
    2016-11-11
  • JVM完全解读之GC日志记录分析

    JVM完全解读之GC日志记录分析

    这篇文章主要介绍了JVM完全解读之GC日志记录分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-01-01
  • spring MVC中传递对象参数示例详解

    spring MVC中传递对象参数示例详解

    这篇文章主要给大家介绍了在spring MVC中传递对象参数的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看吧。
    2017-06-06
  • Mybatis插件之自动生成不使用默认的驼峰式操作

    Mybatis插件之自动生成不使用默认的驼峰式操作

    这篇文章主要介绍了Mybatis插件之自动生成不使用默认的驼峰式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 关于ScheduledThreadPoolExecutor不执行的原因分析

    关于ScheduledThreadPoolExecutor不执行的原因分析

    这篇文章主要介绍了关于ScheduledThreadPoolExecutor不执行的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 实例详解MyBatis-plus自动填充功能

    实例详解MyBatis-plus自动填充功能

    每次对数据进行新增、删除、修改时都需要对这些字段进行设置,虽然新增时间和修改时间可以使用数据库的时间,但是新增人和修改人就不能使用这样的功能,下面小编给大家介绍下MyBatis-plus自动填充功能的实例代码,感兴趣的朋友一起看看吧
    2022-01-01
  • 使用Mybatis-plus清空表数据的操作方法

    使用Mybatis-plus清空表数据的操作方法

    MyBatis 是一个基于 java 的持久层框架,它内部封装了 jdbc,极大提高了我们的开发效率,文中给大家介绍了MybatisPlus常用API-增删改查功能,感兴趣的朋友跟随小编一起看看吧
    2022-11-11

最新评论