android上传文件到http服务器

来源:互联网 发布:投行 固定收益部 知乎 编辑:程序博客网 时间:2024/06/06 07:23
下面是我在网上找的java类,测试是可以用的。
package com.common;        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.Iterator;        import java.util.Map;        import java.util.UUID;        import android.os.Environment;        import android.util.Log;/** * * 上传工具类 * @author spring sky<br> * Email :vipa1888@163.com<br> * QQ: 840950105<br> * 支持上传文件和参数 */public class UploadUtil1 {    private static UploadUtil1 uploadUtil;    private static final String BOUNDARY =  UUID.randomUUID().toString(); // 边界标识 随机生成    private static final String PREFIX = "--";    private static final String LINE_END = "\r\n";    private static final String CONTENT_TYPE = "multipart/form-data"; // 内容类型    private UploadUtil1() {    }    /**     * 单例模式获取上传工具类     * @return     */    public static UploadUtil1 getInstance() {        if (null == uploadUtil) {            uploadUtil = new UploadUtil1();        }        return uploadUtil;    }    private static final String TAG = "UploadUtil";    private int readTimeOut = 10 * 1000; // 读取超时    private int connectTimeout = 10 * 1000; // 超时时间    /***     * 请求使用多长时间     */    private static int requestTime = 0;    private static final String CHARSET = "utf-8"; // 设置编码    /***     * 上传成功     */    public static final int UPLOAD_SUCCESS_CODE = 1;    /**     * 文件不存在     */    public static final int UPLOAD_FILE_NOT_EXISTS_CODE = 2;    /**     * 服务器出错     */    public static final int UPLOAD_SERVER_ERROR_CODE = 3;    protected static final int WHAT_TO_UPLOAD = 1;    protected static final int WHAT_UPLOAD_DONE = 2;    /**     * android上传文件到服务器     *     * @param filePath     *            需要上传的文件的路径     * @param fileKey     *            在网页上<input type=file name=xxx/> xxx就是这里的fileKey     * @param RequestURL     *            请求的URL     */    public void uploadFile(String filePath, String fileKey, String RequestURL,                           Map<String, String> param) {        if (filePath == null) {            sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");            return;        }        try {            File file = new File(filePath);            uploadFile(file, fileKey, RequestURL, param);        } catch (Exception e) {            sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");            e.printStackTrace();            return;        }    }    /**     * android上传文件到服务器     *     * @param file     *            需要上传的文件     * @param fileKey     *            在网页上<input type=file name=xxx/> xxx就是这里的fileKey     * @param RequestURL     *            请求的URL     */    public void uploadFile(final File file, final String fileKey,                           final String RequestURL, final Map<String, String> param) {        if (file == null || (!file.exists())) {            sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE,"文件不存在");            return;        }        Log.i(TAG, "请求的URL=" + RequestURL);        Log.i(TAG, "请求的fileName=" + file.getName());        Log.i(TAG, "请求的fileKey=" + fileKey);        new Thread(new Runnable() {  //开启线程上传文件            @Override            public void run() {                toUploadFile(file, fileKey, RequestURL, param);            }        }).start();    }    private void toUploadFile(File file, String fileKey, String RequestURL,                              Map<String, String> param) {        String result = null;        requestTime= 0;        long requestTime = System.currentTimeMillis();        long responseTime = 0;        try {            URL url = new URL(RequestURL);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setReadTimeout(readTimeOut);            conn.setConnectTimeout(connectTimeout);            conn.setDoInput(true); // 允许输入流            conn.setDoOutput(true); // 允许输出流            conn.setUseCaches(false); // 不允许使用缓存            conn.setRequestMethod("POST"); // 请求方式            conn.setRequestProperty("Charset", CHARSET); // 设置编码            conn.setRequestProperty("connection", "keep-alive");           // conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);//          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");            /**             * 当文件不为空,把文件包装并且上传             */            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());            StringBuffer sb = null;            String params = "";            /***             * 以下是用于上传参数             */            if (param != null && param.size() > 0) {                Iterator<String> it = param.keySet().iterator();                while (it.hasNext()) {                    sb = null;                    sb = new StringBuffer();                    String key = it.next();                    String value = param.get(key);                    sb.append(PREFIX).append(BOUNDARY).append(LINE_END);                    sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(LINE_END).append(LINE_END);                    sb.append(value).append(LINE_END);                    params = sb.toString();                    Log.i(TAG, key+"="+params+"##");                    dos.write(params.getBytes());                  //  dos.flush();                }            }            sb = null;            params = null;            sb = new StringBuffer();            /**             * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件             * filename是文件的名字,包含后缀名的 比如:abc.png             */            sb.append(PREFIX).append(BOUNDARY).append(LINE_END);            sb.append("Content-Disposition:form-data; name=\"" + fileKey                    + "\"; filename=\"" + file.getName() + "\"" + LINE_END);            sb.append("Content-Type:image/jpeg" + LINE_END); // 这里配置的Content-type很重要的 ,用于服务器端辨别文件的类型的           // sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);            sb.append(LINE_END);            params = sb.toString();            Log.d(TAG, "toUploadFile: ************----------------------->>>     "+params);            sb = null;            Log.i(TAG, file.getName()+"=" + params+"##");            dos.write(params.getBytes());            /**上传文件*/            InputStream is = new FileInputStream(file);//            onUploadProcessListener.initUpload((int)file.length());            byte[] bytes = new byte[1024];            int len = 0;            int curLen = 0;            while ((len = is.read(bytes)) != -1) {                curLen += len;                dos.write(bytes, 0, len);              //  onUploadProcessListener.onUploadProcess(curLen);            }            is.close();            dos.write(LINE_END.getBytes());            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();            dos.write(end_data);            dos.flush();////          dos.write(tempOutputStream.toByteArray());            /**             * 获取响应码 200=成功 当响应成功,获取响应的流             */            int res = conn.getResponseCode();            responseTime = System.currentTimeMillis();            this.requestTime = (int) ((responseTime-requestTime)/1000);            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);                sendMessage(UPLOAD_SUCCESS_CODE, "上传结果:"                        + result);                return;            } else {                Log.e(TAG, "request error");                sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:code=" + res);                return;            }        } catch (MalformedURLException e) {            sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());            e.printStackTrace();            return;        } catch (IOException e) {            sendMessage(UPLOAD_SERVER_ERROR_CODE,"上传失败:error=" + e.getMessage());            e.printStackTrace();            return;        }    }    /**     * 发送上传结果     * @param responseCode     * @param responseMessage     */    private void sendMessage(int responseCode,String responseMessage)    {//        onUploadProcessListener.onUploadDone(responseCode, responseMessage);    }    /**     * 下面是一个自定义的回调函数,用到回调上传文件是否完成     *     * @author shimingzheng     *     */    public static interface OnUploadProcessListener {        /**         * 上传响应         * @param responseCode         * @param message         */        void onUploadDone(int responseCode, String message);        /**         * 上传中         * @param uploadSize         */        void onUploadProcess(int uploadSize);        /**         * 准备上传         * @param fileSize         */        void initUpload(int fileSize);    }    private OnUploadProcessListener onUploadProcessListener;    public void setOnUploadProcessListener(            OnUploadProcessListener onUploadProcessListener) {        this.onUploadProcessListener = onUploadProcessListener;    }    public int getReadTimeOut() {        return readTimeOut;    }    public void setReadTimeOut(int readTimeOut) {        this.readTimeOut = readTimeOut;    }    public int getConnectTimeout() {        return connectTimeout;    }    public void setConnectTimeout(int connectTimeout) {        this.connectTimeout = connectTimeout;    }    /**     * 获取上传使用的时间     * @return     */    public static int getRequestTime() {        return requestTime;    }    public static interface uploadProcessListener{    }    public void doFileUpload(String urlString,String existingFileName,String keyStr) {        HttpURLConnection conn = null;        //DataOutputStream dos = null;        DataInputStream inStream = null;        //String existingFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/mypic.png";        String lineEnd = "\r\n";        String twoHyphens = "--";        String boundary = "*****";        int bytesRead, bytesAvailable, bufferSize;        byte[] buffer;        int maxBufferSize = 1 * 1024 * 1024;        String responseFromServer = "";       // String urlString = "http://mywebsite.com/directory/upload.php";        Log.d(TAG, "doFileUpload: urlString:"+urlString+"   existingFileName:"+existingFileName);        try {            //------------------ CLIENT REQUEST            FileInputStream fileInputStream = new FileInputStream(new File(existingFileName));            // open a URL connection to the Servlet            URL url = new URL(urlString);            // Open a HTTP connection to the URL            conn = (HttpURLConnection) url.openConnection();            // Allow Inputs            conn.setDoInput(true);            // Allow Outputs            conn.setDoOutput(true);            // Don't use a cached copy.            conn.setUseCaches(false);            // Use a post method.            conn.setRequestMethod("POST");            conn.setRequestProperty("Charset", "utf-8");            conn.setRequestProperty("Connection", "Keep-Alive");            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);           // dos = new DataOutputStream(conn.getOutputStream());            Log.d(TAG, "doFileUpload: ********  1");            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());            Log.d(TAG, "doFileUpload: ********  2");            dos.writeBytes(twoHyphens + boundary + lineEnd);            dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + existingFileName + "\"" + lineEnd);            dos.writeBytes(lineEnd);            // create a buffer of maximum size            bytesAvailable = fileInputStream.available();            bufferSize = Math.min(bytesAvailable, maxBufferSize);            buffer = new byte[bufferSize];            // read file and write it into form...            bytesRead = fileInputStream.read(buffer, 0, bufferSize);            while (bytesRead > 0) {                dos.write(buffer, 0, bufferSize);                bytesAvailable = fileInputStream.available();                bufferSize = Math.min(bytesAvailable, maxBufferSize);                bytesRead = fileInputStream.read(buffer, 0, bufferSize);            }            // send multipart form data necesssary after file data...            dos.writeBytes(lineEnd);            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);            // close streams            Log.e("Debug", "File is written");            fileInputStream.close();            dos.flush();            dos.close();        } catch (MalformedURLException ex) {            Log.e("Debug", "error: " + ex.getMessage(), ex);        } catch (IOException ioe) {            Log.e("Debug", "error: " + ioe.getMessage(), ioe);        }        //------------------ read the SERVER RESPONSE        try {            inStream = new DataInputStream(conn.getInputStream());            String str;            while ((str = inStream.readLine()) != null) {                Log.e("Debug", "Server Response " + str);            }            inStream.close();        } catch (IOException ioex) {            Log.e("Debug", "error: " + ioex.getMessage(), ioex);        }    }}


在Activity中调用的方法

                File file = new File(PhotoFileName);                 String fileKey = "file"; //这个是关键,需要注意 在我的上一篇文章中有MVC上传文件的方法,需要和<input name="file">中name相同                UploadUtil1 uploadUtil = UploadUtil1.getInstance();                Map<String, String> params = new HashMap<String, String>();                params.put("barcode", "11111"); //这里是另外一个<input name="barcode">                uploadUtil.uploadFile(  file,fileKey, UploadImageURL,params);                 PhotoResult.setImageBitmap(null);

我的MVC上传文件代码

http://blog.csdn.net/easyboot/article/details/78614573

原创粉丝点击