使用HttpUrlConnect做数据上传遇到的坑及解决办法

1.点击获取设备文件(当前上传的excel文件)

 

Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/*/*");//无类型限制
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent,1);

在onActiivtyForResult方法中通过data.getData方法获取Uri

通过uri.getPath方法获取文件对应的绝对路径

问题:当前路径含有raw:字样,这种路径是不符合要求的,需要截取冒号以后的路径

2.选择文件后做文件上传

遇到的问题,请求返回了200,但是没有返回结果,

原因分析:请求体没有加

 

请求头和请求体必须要加

请求头(这个很重要)

con.setRequestProperty("Content-Type",
        "multipart/form-data;boundary=" + boundary);
请求体(这个也必须要设置)
ds.writeBytes("Content-Disposition: form-data; " +
        "name=\"file\";filename=\"" +
        file1.getName() + "\"" + end);

http构成

 

 

 

 

 

核心代码如下:

  private void upLoadFile(String serverUrl, String strFile) {
        File file1=new File(strFile);

        String end = "\r\n";
        String twoHyphens = "--";
//        String boundary = "*****";
        String boundary = "----WebKitFormBoundaryGbm6yYc5V2yilQRE";
        try {
            URL url=new URL(serverUrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);

            con.setConnectTimeout(50000);
            con.setReadTimeout(50000);
            /* 设置传送的method=POST */
            con.setRequestMethod("POST");
            /* setRequestProperty */
            con.setRequestProperty("Connection", "Keep-Alive");
            con.setRequestProperty("Charset", "UTF-8");
            con.setRequestProperty("Cookie",  "custom.name="+ SpfUtils.getSpfSaveStr(Constant.sessionId));
            con.setRequestProperty("Content-Type",
                    "multipart/form-data;boundary=" + boundary);

            con.connect();

            // 设置DataOutputStream
            DataOutputStream ds = new DataOutputStream(con.getOutputStream());

            ds.writeBytes(twoHyphens + boundary + end);

            ds.writeBytes("Content-Disposition: form-data; " +
                    "name=\"file\";filename=\"" +
                    file1.getName() + "\"" + end);
          /*  Log.i("Disposition","Content-Disposition: form-data; " +
                    "name=\"file\";filename=\"" +
                    file1.getName() + "\"" + end);*/

            /*  ds.writeBytes("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");*/
            ds.writeBytes(end);



            // 取得文件的FileInputStream
             file=new File(strFile);
            FileInputStream fStream = new FileInputStream(file);

            // 设置每次写入1024bytes
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            int length = -1;
            // 从文件读取数据至缓冲区
            while ((length = fStream.read(buffer)) != -1) {
                // 将资料写入DataOutputStream中
                ds.write(buffer, 0, length);
            }

            ds.writeBytes(end);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
            ds.flush();
            fStream.close();
            ds.close();
            if(con.getResponseCode() == 200){
                Log.i("文件上传成功!上传文件为:" , con.getResponseCode()+strFile+"ftg="+con.getResponseMessage());

                InputStream inputStream=con.getInputStream();
                StringBuffer sb1 = new StringBuffer();
                int ss;
                while ((ss = inputStream.read()) != -1) {
                    sb1.append((char) ss);
                }
                String result = sb1.toString();




                JSONObject shop_user = JSON.parseObject(result);

                 returnPath=  JSON.parseObject(shop_user.getString("resultData")).getString("filePath");
                ll_file.setVisibility(View.VISIBLE);

                file_name.setText(file.getName());





            }








            /*   String strFileName = strFile.substring(strFile.lastIndexOf("/") + 1);
             *//* 设置DataOutputStream *//*
            DataOutputStream ds =
                    new DataOutputStream(con.getOutputStream());
            ds.writeBytes(twoHyphens + boundary + end);
            ds.writeBytes("Content-Disposition: form-data; " +
                    "name=\"file1\";filename=\"" +
                    strFileName + "\"" + end);
            ds.writeBytes(end);
            *//* 取得文件的FileInputStream *//*
            FileInputStream fStream = new FileInputStream(strFile);
            *//* 设置每次写入1024bytes *//*
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            int length = -1;
            *//* 从文件读取数据至缓冲区 *//*
            while ((length = fStream.read(buffer)) != -1) {
                *//* 将资料写入DataOutputStream中 *//*
                ds.write(buffer, 0, length);
            }
            ds.writeBytes(end);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
            *//* close streams *//*
            fStream.close();
            ds.flush();
            *//* 取得Response内容 *//*
            InputStream is = con.getInputStream();
            int ch;
            StringBuffer b = new StringBuffer();
            while ((ch = is.read()) != -1) {
                b.append((char) ch);
            }
            *//* 关闭DataOutputStream *//*
            ds.close();
            is.close();
            if(con.getResponseCode() == 200){
                Log.i("文件上传成功!上传文件为:" , strFile);
            }*/

        } catch (Exception  e) {
            e.printStackTrace();
            Log.i("上传失败",strFile);
            Log.i("原因",e.toString());
        }
    }

参考链接:https://blog.csdn.net/lizhengwei1989/article/details/75635261

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值