Android开发中上传文件到服务器类

        安卓开发中,向服务器上传照片、音频、视频都是及其常见的事,下面上传一份上传工具类,既然是工具拿去用就是了,里面重点部分做了注释

package com.suowei.appsuowei.util;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.UUID;

import android.util.Log;

public class UpLoadFileToSerUtil {
	/**
	 * 上传文件到服务器类
	 * 
	 * @author tom
	 */
	    private static final String TAG = "uploadFile";


	    private static final int TIME_OUT = 10 * 1000; // 超时时间


	    private static final String CHARSET = "utf-8"; // 设置编码


	    /**
	     * Android上传文件到服务端
	     * 
	     * @param file 需要上传的文件
	     * @param RequestURL 请求的rul
	     * @return 返回响应的内容
	     */
	    public static String uploadFile(File file, String RequestURL) {
	        String result = null;
	        String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
	        String PREFIX = "--", LINE_END = "\r\n";
	        String CONTENT_TYPE = "multipart/form-data"; // 内容类型


	        try {
	            URL url = new URL(RequestURL);
	            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	            conn.setReadTimeout(TIME_OUT);
	            conn.setConnectTimeout(TIME_OUT);
	            conn.setDoInput(true); // 允许输入流
	            conn.setDoOutput(true); // 允许输出流
	            conn.setUseCaches(false); // 不允许使用缓存
	            conn.setRequestMethod("POST"); // 请求方式
	            conn.setRequestProperty("Charset", CHARSET); // 设置编码
	            conn.setRequestProperty("connection", "keep-alive");
	            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
	            conn.setChunkedStreamingMode(20*1024);

	            if (file != null) {
	                /**
	                 * 当文件不为空,把文件包装并且上传
	                 */
	                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
	                StringBuffer sb = new StringBuffer();
	                sb.append(PREFIX);
	                sb.append(BOUNDARY);
	                sb.append(LINE_END);
	                /**
	                 * 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
	                 * filename是文件的名字,包含后缀名的 比如:abc.png
	                 */

	                sb.append("Content-Disposition: form-data; name=\"file\"; 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);
	                DataInputStream dataInputStream=new DataInputStream(is);
	                byte[] bytes = new byte[1024];
	                int len = 0;

	                while ((len = dataInputStream.read(bytes)) != -1) {
	                	
	                    dos.write(bytes, 0, len);
	                }
	                is.close();
	                dataInputStream.close();
	                dos.write(LINE_END.getBytes());
	                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
	                dos.write(end_data);
	                dos.flush();
	                /**
	                 * 获取响应码 200=成功 当响应成功,获取响应的流
	                 */
	                int res = conn.getResponseCode();
	                Log.e(TAG, "response code:" + res);
	                 if(res==200)
	                 {
	                Log.e(TAG, "request success");
	                InputStream input = conn.getInputStream();
	                StringBuffer sb1 = new StringBuffer();
	                int ss;
	                while ((ss = input.read()) != -1) {
	                    sb1.append((char) ss);
	                }
	                result = sb1.toString();
	                Log.e(TAG, "result : " + result);
	                 }
	                 else{
	                 Log.e(TAG, "request error");
	                 }
	            }
	        } catch (MalformedURLException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	        return result;
	    }


	    /**
	     * 通过拼接的方式构造请求内容,实现参数传输以及文件传输
	     * 
	     * @param url Service net address
	     * @param params text content
	     * @param files pictures
	     * @return String result of Service response
	     * @throws IOException
	     */
	    public static String post(String url, Map<String, String> params, Map<String, File> files)
	            throws IOException {
	        String BOUNDARY = java.util.UUID.randomUUID().toString();
	        String PREFIX = "--", LINEND = "\r\n";
	        String MULTIPART_FROM_DATA = "multipart/form-data";
	        String CHARSET = "UTF-8";


	        URL uri = new URL(url);
	        HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
	        conn.setReadTimeout(10 * 1000); // 缓存的最长时间
	        conn.setDoInput(true);// 允许输入
	        conn.setDoOutput(true);// 允许输出
	        conn.setUseCaches(false); // 不允许使用缓存
	        conn.setRequestMethod("POST");
	        conn.setRequestProperty("connection", "keep-alive");
	        conn.setRequestProperty("Charsert", "UTF-8");
	        conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);


	        // 首先组拼文本类型的参数
	        StringBuilder sb = new StringBuilder();
	        for (Map.Entry<String, String> entry : params.entrySet()) {
	            sb.append(PREFIX);
	            sb.append(BOUNDARY);
	            sb.append(LINEND);
	            sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
	            sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
	            sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
	            sb.append(LINEND);
	            sb.append(entry.getValue());
	            sb.append(LINEND);
	        }


	        DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
	        outStream.write(sb.toString().getBytes());
	        // 发送文件数据
	        if (files != null)
	            for (Map.Entry<String, File> file : files.entrySet()) {
	                StringBuilder sb1 = new StringBuilder();
	                sb1.append(PREFIX);
	                sb1.append(BOUNDARY);
	                sb1.append(LINEND);
	                sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
	                        + file.getValue().getName() + "\"" + LINEND);
	                sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);
	                sb1.append(LINEND);
	                outStream.write(sb1.toString().getBytes());


	                InputStream is = new FileInputStream(file.getValue());
	                byte[] buffer = new byte[1024];
	                int len = 0;
	                while ((len = is.read(buffer)) != -1) {
	                    outStream.write(buffer, 0, len);
	                }


	                is.close();
	                outStream.write(LINEND.getBytes());
	            }


	        // 请求结束标志
	        byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
	        outStream.write(end_data);
	        outStream.flush();
	        // 得到响应码
	        int res = conn.getResponseCode();
	        InputStream in = conn.getInputStream();
	        StringBuilder sb2 = new StringBuilder();
	        if (res == 200) {
	            int ch;
	            while ((ch = in.read()) != -1) {
	                sb2.append((char) ch);
	            }
	        }
	        outStream.close();
	        conn.disconnect();
	        return sb2.toString();
	    }
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 上传文件服务器和下载文件至本地,亲测有效,只需传入相关参数即可。/** * android上传文件服务器 * * @param file * 需要上传的文件 * @param RequestURL * 请求的rul * @return 返回响应的内容 */ public static String uploadFile(Map<String,String>params,File file, String RequestURL) { String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成 String PREFIX = "--", LINE_END = "\r\n"; String CONTENT_TYPE = "multipart/form-data"; // 内容型 try { URL url = new URL(RequestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoInput(true); // 允许输入流 conn.setDoOutput(true); // 允许输出流 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); // 请求方式 conn.setRequestProperty("Charset", CHARSET); // 设置编码 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); if (file != null) { Log.i(TAG, "====file is"+file); /** * 当文件不为空,把文件包装并且上传 */ OutputStream outputSteam = conn.getOutputStream(); DataOutputStream dos = new DataOutputStream(outputSteam); StringBuffer sb = new StringBuffer(); /************************上传表单的一些设置信息***********************************/ if (params != null) for (String key : params.keySet()) { sb.append("--" + BOUNDARY + "\r\n"); sb.append("Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n"); sb.append("\r\n"); sb.append(params.get(key) + "\r\n"); } /************************上传文件的一些设置信息***********************************/ sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END); /** * 这里重点注意: name里面服务器需要key 只有这个key 才可以得到对应文件 * filename是文件的名字,包含后缀名的 比如:abc.p

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值