• http 上传文件


    注:安卓上传图片跟文件的本质就是post请求而已,只是在post请求的数据中,插入文件的数据(这个用FileinputStream转成流,来插到post请求的数据中)。而图片跟文件对FileinputStream来说,都是文件,所以,需要在payLoad那里,设置上传文件的格式(具体怎么搞,可以跟后台协议一下)! 
    在这个例子里,我仅需上传.jpg图片,就这样写了,改成.txt之类的,例子里有说明。

        /**
         * fileName 文件名(不带后缀)
         * filePath 文件的本地路径 (xxx / xx / test.jpg)
         */ 
        public void uploadFile(String fileName , String filePath) {
    
            HttpURLConnection conn = null;
    
            /// boundary就是request头和上传文件内容的分隔符(可自定义任意一组字符串)
            String BOUNDARY = "******";
            // 用来标识payLoad+文件流的起始位置和终止位置(相当于一个协议,告诉你从哪开始,从哪结束)
            String  preFix = ("
    --" + BOUNDARY + "--
    ");
    
            try {
                // (HttpConst.uploadImage 上传到服务器的地址
                URL url = new URL(HttpConst.uploadImage);
                conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setReadTimeout(30000);
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方法
                conn.setRequestMethod("POST");
                // 设置header
                conn.setRequestProperty("Accept","*/*");
                conn.setRequestProperty("Connection", "keep-alive");
                conn.setRequestProperty("Content-Type",
                        "multipart/form-data; boundary=" + BOUNDARY);
                // 获取写输入流
                OutputStream out = new DataOutputStream(conn.getOutputStream());
                // 获取上传文件
                File file = new File(filePath);
    
                // 要上传的数据
                StringBuffer strBuf = new StringBuffer();
    
                // 标识payLoad + 文件流的起始位置
                strBuf.append(preFix);
    
                // 下面这三行代码,用来标识服务器表单接收文件的name和filename的格式
                // 在这里,我们是file和filename.后缀[后缀是必须的]。
                // 这里的fileName必须加个.jpg,因为后台会判断这个东西。
                // 这里的Content-Type的类型,必须与fileName的后缀一致。
                // 如果不太明白,可以问一下后台同事,反正这里的name和fileName得与后台协定!
                // 这里只要把.jpg改成.txt,把Content-Type改成上传文本的类型,就能上传txt文件了。
                strBuf.append("Content-Disposition: form-data; name="file"; filename="" + fileName+".jpg" + ""
    ");
                strBuf.append("Content-Type: image/jpeg"  + "
    
    ");
                out.write(strBuf.toString().getBytes());
    
                // 获取文件流
                FileInputStream fileInputStream = new FileInputStream(file);
                DataInputStream inputStream = new DataInputStream(fileInputStream);
    
                // 每次上传文件的大小(文件会被拆成几份上传)
                int bytes = 0;
                // 计算上传进度
                float count = 0;
                // 获取文件总大小
                int fileSize = fileInputStream.available();
                // 每次上传的大小
                byte[] bufferOut = new byte[1024];
                // 上传文件
                while ((bytes = inputStream.read(bufferOut)) != -1) {
                    // 上传文件(一份)
                    out.write(bufferOut, 0, bytes);
                    // 计算当前已上传的大小
                    count += bytes;
                    // 打印上传文件进度(已上传除以总大*100就是进度)
                    utils.logD("progress:" +(count / fileSize * 100) +"%");
                }
    
                // 关闭文件流
                inputStream.close();
    
                // 标识payLoad + 文件流的结尾位置
                out.write(preFix.getBytes());
    
                // 至此上传代码完毕
    
                // 总结上传数据的流程:preFix + payLoad(标识服务器表单接收文件的格式) + 文件(以流的形式) + preFix
                // 文本与图片的不同,仅仅只在payLoad那一处的后缀的不同而已。
    
                // 输出所有数据到服务器
                out.flush();
    
                // 关闭网络输出流
                out.close();
    
                // 重新构造一个StringBuffer,用来存放从服务器获取到的数据
                strBuf = new StringBuffer();
    
                // 打开输入流 , 读取服务器返回的数据
                BufferedReader reader = new BufferedReader(new
                        InputStreamReader(conn.getInputStream()));
    
                String line;
    
                // 一行一行的读取服务器返回的数据
                while ((line = reader.readLine()) != null) {
                    strBuf.append(line).append("
    ");
                }
    
                // 关闭输入流
                reader.close();
    
                // 打印服务器返回的数据
                utils.logD("上传成功:"+strBuf.toString());
    
            } catch (Exception e) {
                utils.logD("上传图片出错:"+e.toString());
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
            }
    
        }
  • 相关阅读:
    Gengxin讲STL系列——Set
    理解Python的With语句
    Python中Non-ASCII character 'xe7' in file的问题解决
    gnome-terminal的一些调整
    硬盘的CHS寻址
    Wiz发布cnblog笔记
    cygwin安装man手册
    linux命令行使用
    小步前进
    学习的感觉真好
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/7456952.html
Copyright © 2020-2023  润新知