通过HttpURLConnection链接上传文件和参数,核心代码及操作步骤

public static String uploadFile(String url, Map<String, String> params, File file) {
        // 换行,或者说是回车
        //final String newLine = "\r\n";
        final String newLine = "\r\n";
        // 固定的前缀
        final String preFix = "--";
        //final String preFix = "";
        // 分界线,就是上面提到的boundary,可以是任意字符串,建议写长一点,这里简单的写了一个#
        final String bounDary = "----WebKitFormBoundaryCXRtmcVNK0H70msG";
        //final String bounDary = "";
        //请求返回内容
        String output = "";

try {
            //统一资源定位符
            URL uploadFileUrl = new URL(url);
            //打开http链接类
            HttpURLConnection httpURLConnection = (HttpURLConnection) uploadFileUrl.openConnection();
            //设置是否向httpURLConnection输出
            httpURLConnection.setDoOutput(true);
            //设置请求方法默认为get
            httpURLConnection.setRequestMethod("POST");
            //Post请求不能使用缓存
            httpURLConnection.setUseCaches(false);
            //设置token
            httpURLConnection.setRequestProperty("authorization", (String) GlobalContext.getSessionAttribute("token"));
            //为web端请求
            httpURLConnection.setRequestProperty("os", "web");
            //从新设置请求内容类型
            httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
            httpURLConnection.setRequestProperty("Accept", "*/*");
            httpURLConnection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            httpURLConnection.setRequestProperty("Cache-Control", "no-cache");
            //application/json;charset=UTF-8 application/x-www-form-urlencoded
            httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + bounDary);
            httpURLConnection.setRequestProperty("User-Agent", "(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36)");

DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());

//设置DataOutputStream设置DataOutputStream数据输出流
            //OutputStream outputStream = httpURLConnection.getOutputStream();

//上传普通文本文件
            if (params.size() != 0 && params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    //获取参数名称和值
                    String key = entry.getKey();
                    String value = params.get(key);
                    //向请求中写分割线
                    dos.writeBytes(preFix + bounDary + newLine);
                    //向请求拼接参数
                    //String parm = key + "=" + URLEncoder.encode(value,"utf-8") +"\r\n" ;
                    dos.writeBytes("Content-Disposition: form-data; " + "name=\"" + key + "\"" + newLine);
                    //向请求中拼接空格
                    dos.writeBytes(newLine);
                    //写入值
                    dos.writeBytes(URLEncoder.encode(value, "utf-8"));
                    //dos.writeBytes(value);
                    //向请求中拼接空格
                    dos.writeBytes(newLine);
                }
            }

//上传文件
            if (file != null && !params.isEmpty()) {
                //向请求中写分割线
                //把file装换成byte
                File del = new File(file.toURI());
                InputStream inputStream = new FileInputStream(del);
                byte[] bytes= input2byte(inputStream);
                String filePrams = "file";
                String fileName = file.getName();
                //向请求中加入分隔符号
                dos.write((preFix + bounDary + newLine).getBytes());
                //将byte写入
                dos.writeBytes("Content-Disposition: form-data; " + "name=\"" + URLEncoder.encode(filePrams, "utf-8") + "\"" + "; filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"" + newLine);
                dos.writeBytes(newLine);
                dos.write(bytes);
                //向请求中拼接空格
                dos.writeBytes(newLine);
            }
            dos.writeBytes(preFix + bounDary + preFix + newLine);
            //请求完成后关闭流
            //得到相应码
            dos.flush();
            //判断请求没有成功
            if (httpURLConnection.getResponseCode() != 200) {
                logger.error(url + "   请求异常,错误代码为:  " + httpURLConnection.getResponseCode());
                return "{result:'fail',response:'errorCode:" + httpURLConnection.getResponseCode() + "'}";
            }
            //判断请求成功
            if (httpURLConnection.getResponseCode() == 200) {
                //将服务器的数据转化返回到客户端
                InputStream inputStream = httpURLConnection.getInputStream();
                byte[] bytes = new byte[0];
                bytes = new byte[inputStream.available()];
                inputStream.read(bytes);
                output = new String(bytes);
                inputStream.close();
            }
            dos.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(url + "   请求异常,错误信息为:  " + e.getMessage());
            return "{result:'fail',response:'" + e.getMessage() + "'}";
        }
        return output;
    }

/**
     * 将输入流转化成字节流
     * @param inStream
     * @return
     * @throws IOException
     */
    public static final byte[] input2byte(InputStream inStream) throws IOException {
        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while ((rc = inStream.read(buff, 0, 100)) > 0) {
            swapStream.write(buff, 0, rc);
        }
        byte[] in2b = swapStream.toByteArray();
        return in2b;
    }

通过HttpURLConnection连接上传文件和参数相关推荐

  1. 通过HttpURLConnection连接上传文件和参数并接收

    网上使用HttpURLConnection通过get或post请求传递参数或者传递文件的例子有很多.但是同时传递参数和文件,服务的并接收参数和文件的例子很少!此文将介绍同时发送参数和文件并接收. 1. ...

  2. Django之用户上传文件的参数配置

    Django之用户上传文件的参数配置 models.py文件 class Xxoo(models.Model):title = models.CharField(max_length=128)# me ...

  3. c#同时上传文件和参数,Java接收的完整教程,炒鸡简单!网上的教程弱爆了!

    工作需求,需要在c#端将文件和数据进行上传,Java端接收文件上传到oss,将数据处理到数据库. 这个教程,秒杀市面百分九十九的帖子,绝对是楼主精心打造! 一.网上的一般做法 网上搜出来的教程,基本都 ...

  4. vue上传文件到php,vue+axios+php如何实现上传文件功能?,formdata上传文件附加参数...

    vue+axios+php如何实现上传文件功能?Vue Axios PHP如何实现上传文件的功能?, 推荐:<PHP视频教程> 当我们提交表单时,我们经常会遇到一些表单提交要求.vue的a ...

  5. android显示服务器端文件夹,Android上传文件到服务端并显示进度条

    最近在做上传文件的服务,简单看了网上的教程.结合实践共享出代码. 由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢. Ok,先上代码. Android 上传比较简单,主要用到的是 Ht ...

  6. servlet修改用户头像_Java上传文件实现更换头像

    本博文主要说,用户如何更换头像的操作 1.首先要有一个util的工具类(直接用就可以)上传文件需要的jar包,在最下方. package com.hp.factory; import java.io. ...

  7. SpringBoot+Vue上传文件

    最近在研究SpringBoot+Vue的文件上传,踩了不少坑.现在将正确的文件上传流程分享一下. 一.前端采用ElementUI组件 前端页面完整代码: <template><el- ...

  8. 腾讯云cos上传文件功能封装

    前言:要使用cos要先去腾讯云创建cos储存桶,创建完储存桶按步骤来就可以了. 安装依赖 npm i cos-js-sdk-v5 创建文件upload.js const COS = require(' ...

  9. java url 上传文件_Java使用HttpURLConnection上传文件(转)

    从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是 ...

最新文章

  1. Cloud Native概念
  2. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
  3. Android图片粘上后仍错误,android – 在Activity被销毁后,ImageView上的图像丢失了
  4. 开发中最常使用到那些设计模式?
  5. 黑苹果hp有声音hdmi无声音_黑科技!不戴耳机也能独享声音!以色列公司推出无耳机传输音乐...
  6. 移动游戏市场Testin云测占有率超过90%
  7. 互联网日报 | 3月21日 星期日 | 贾玲成全球票房最高女导演;顺丰全货机数量增至64架;东京奥运会不接待国外观众...
  8. 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?...
  9. sublime 设置自动更新_Win10关闭自动更新的三种方法
  10. 设置指定打印机端口打印
  11. Swift - 使用导航条和导航条控制器来进行页面切换并传递数据
  12. matlab鲍威尔算法,鲍威尔法matlab程序
  13. 自我管理-不同层级的沟通
  14. 关于“程序员996”,互联网大神发话了,能顶用吗?
  15. 句子迷 有哪些你第一眼就爱上的电影台词
  16. js 根据链接下载 excel 文件
  17. N95滤材之父:滤材才是关键!道翰天琼认知智能机器人平台API接口大脑为您揭秘-2。
  18. 【seaborn】jointplot 改变图片长宽比,非方形
  19. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。(js代码)
  20. 链表与其多种接口实现1

热门文章

  1. linux下查看tomcat的端口号
  2. 中断机制及ZCU102 DMA中断实例
  3. 【路径规划】基于matlab蚁群算法机器人大规模栅格地图最短路径规划【含Matlab源码 1860期】
  4. manjaro安装-制作安装U盘
  5. Java面试题--jvm
  6. Ubuntu怎么切换为中文版
  7. 【JavaScript:快速入门】
  8. python学习日记
  9. Linux CentOS删除或重命名文件夹和文件的办法
  10. 存储与虚拟主机管理,克隆虚拟机的详细讲解