android端表单提交文件

本文介绍了一个用于安卓应用的文件上传工具类,该工具类利用HttpURLConnection实现表单数据及文件的上传功能,并支持上传进度监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序:在安卓安卓开发中会遇到后台要求以表单形式上传文件,此时我们就需要用HttpURLClient 进行表单的封装。
1、文件上传工具类

package net.izhuo.app.oldkids.service;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import android.util.Log;

public class UploadConnect {
    private static UploadConnect instance;
    private UploadConnect(){

    }

    public static synchronized UploadConnect getInstance(){
        if (instance==null) {
            instance=new UploadConnect();
        }
        return instance;
    }

    private static final String TAG = "uploadFile";  
    private static final int TIME_OUT = 10*10000000; //超时时间  
    private static final String CHARSET = "utf-8"; //设置编码  
    private static final String PREFIX = "--";  
    private static final String LINE_END = "\r\n";  

    /**
     * 文件上传类
     * @param host //请求地址
     * @param file //文件
     * @param params //文本参数
     * @param listener //监听上传
     */
    public void upload(String host,File file,Map<String,String> params,FileUploadListener listener){  
        String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成 String PREFIX = "--" , LINE_END = "\r\n";  
        String CONTENT_TYPE = "multipart/form-data"; //内容类型  
        try {  
            URL url = new URL(host);  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
            conn.setReadTimeout(TIME_OUT);  
            conn.setConnectTimeout(TIME_OUT);  
            conn.setRequestMethod("POST"); //请求方式  
            conn.setRequestProperty("Charset", CHARSET);//设置编码  
            conn.setRequestProperty("connection", "keep-alive");  
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);  
            conn.setDoInput(true); //允许输入流  
            conn.setDoOutput(true); //允许输出流  
            conn.setUseCaches(false); //不允许使用缓存  
            if(file!=null) {  
                /** * 当文件不为空,把文件包装并且上传 */  
                OutputStream outputSteam=conn.getOutputStream();  
                DataOutputStream dos = new DataOutputStream(outputSteam);  
                StringBuffer sb = new StringBuffer();  
                sb.append(LINE_END);  
                if(params!=null){//根据格式,开始拼接文本参数  
                    for(Map.Entry<String,String> entry:params.entrySet()){                          
                        sb.append(PREFIX).append(BOUNDARY).append(LINE_END);//分界符  
                        sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" +  LINE_END);  
                        sb.append("Content-Type: text/plain; charset=" + CHARSET + LINE_END);  
                        sb.append("Content-Transfer-Encoding: 8bit" + LINE_END);  
                        sb.append(LINE_END);  
                        sb.append(entry.getValue());  
                        sb.append(LINE_END);//换行!  
                    }  
                }  
                sb.append(PREFIX);//开始拼接文件参数  
                sb.append(BOUNDARY); sb.append(LINE_END);  
                /** 
                 * 这里重点注意: 
                 * name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件 
                 * filename是文件的名字,包含后缀名的 比如:xxx.png 
                 */  
                sb.append("Content-Disposition: form-data; name=\"image\"; filename=\""+file.getName()+"\""+LINE_END);  
                sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);  
                sb.append(LINE_END);  
                //写入文件数据  
                dos.write(sb.toString().getBytes());  
                InputStream is = new FileInputStream(file);  
                byte[] bytes = new byte[1024];  
                long totalbytes = file.length();  
                long curbytes = 0;  
                Log.i("cky","total="+totalbytes);  
                int len = 0;  
                while((len=is.read(bytes))!=-1){  
                    curbytes += len;  
                    dos.write(bytes, 0, len);  
                    listener.onProgress(curbytes,1.0d*curbytes/totalbytes);  
                }  
                is.close();  
                dos.write(LINE_END.getBytes());//有换行
                byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();  
                dos.write(end_data);  
                dos.flush();  
                /** 
                 * 获取响应码 200=成功 
                 * 当响应成功,获取响应的流 
                 */  
                int code = conn.getResponseCode();  
                sb.setLength(0);  
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
                String line;  
                while((line=br.readLine())!=null){  
                    sb.append(line);  
                }  
                listener.onFinish(code,sb.toString(),conn.getHeaderFields());  
            }  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
    /**
     * 图片上传监听
     * @author oldkids001
     *
     */
    public interface FileUploadListener{
         public void onProgress(long pro,double precent);  
         public void onFinish(int code,String res,Map<String,List<String>> headers);  
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值