zoukankan      html  css  js  c++  java
  • android 上传文件

    向server上传文件在android开发中是一件在普通只是的事了。正好如今项目中实用到就做一下总结吧。

    • 1.使用HttpURLConnection。这样的方法比較麻烦,须要自己模拟表单提交。
    • 2.使用httpmime库实现,这样的方法是建立在HttpClient基础上的。

      在2.3以后使用HttpURLConnection比使用HttpClient要好。

    • 3.使用OKHttp库实现。


    下边就依次给出实现:

    一.使用HttpURLConnection 实现

    /**
         * 上传文件
         *
         * @param path
         * @param fileList
         */
        public static void useHttpURLConnectionUploadFile(final String path,
                                                          final ArrayList<String> fileList) {
    
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        URL url = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url
                                .openConnection();
    
                        conn.setRequestMethod("POST");
                        conn.setRequestProperty("Connection", "keep-alive");
                        conn.setRequestProperty("Cache-Control", "max-age=0");
                        conn.setRequestProperty("Accept",
                                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
                        conn.setRequestProperty(
                                "user-agent",
                                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari");
                        conn.setRequestProperty("Accept-Encoding",
                                "gzip,deflate,sdch");
                        conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
                        conn.setRequestProperty("Charsert", "UTF-8");
                        conn.setRequestProperty("Content-Type",
                                "multipart/form-data; boundary=" + STARTBOUNDARY);
    
                        OutputStream out = new DataOutputStream(conn
                                .getOutputStream());
                        StringBuffer sb = null;
                        for (int i = 0; i < fileList.size(); i++) {
                            File file = new File(fileList.get(i));
                            sb = new StringBuffer();
                            sb.append(BOUNDARY);
                            sb.append("Content-Disposition: form-data; name="file"
                                    + i + ""; filename="" + file.getName()
                                    + ""
    ");
                            sb.append("Content-Type: application/octet-stream
    
    ");
                            out.write(sb.toString().getBytes());
    
                            DataInputStream inputStream = new DataInputStream(
                                    new FileInputStream(new File(fileList.get(i))));
    
                            int bytes = 0;
                            byte buffer[] = new byte[1024];
                            while ((bytes = inputStream.read(buffer)) != -1) {
    
                                out.write(buffer, 0, bytes);
                            }
                            out.write("
    ".getBytes());
                            inputStream.close();
                        }
    
                        out.write(ENDBOUNDARY.getBytes());
                        out.flush();
                        out.close();
    
                        // 定义BufferedReader输入流来读取URL的响应
                        // 此处必须得到server端的输入流否则上传文件不成功(当php作server端语言的时候是这样,其他语言未试)
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(conn.getInputStream()));
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
    
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
        }

    二 、使用httpmime实现

    /**
         * 上传文件
         *
         * @param url
         * @param files
         */
        public static void useHttpMimeUploadFile(final String url,
                                                 final ArrayList<String> files) {
    
            new Thread(new Runnable() {
    
                @Override
                public void run() {
    
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);
                    MultipartEntityBuilder build = MultipartEntityBuilder.create();
    
                    for (String file : files) {
    
                        FileBody bin = new FileBody(new File(file));
                        StringBody comment = null;
                        try {
                            comment = new StringBody("commit");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        build.addPart(file, bin);
                        build.addPart("comment", comment);
    
                    }
    
                    HttpEntity reqEntity = build.build();
                    httpPost.setEntity(reqEntity);
    
                    try {
                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        if (httpResponse.getStatusLine().getStatusCode() == 200) {
                            HttpEntity resEntity = httpResponse.getEntity();
                            System.out.println(EntityUtils.toString(resEntity));
                        } else {
                            System.out.println("connection error!!!!");
                        }
    
                    } catch (ClientProtocolException e) {
    
                        e.printStackTrace();
                    } catch (IOException e) {
    
                        e.printStackTrace();
                    } finally {
                        httpClient.getConnectionManager().shutdown();
                    }
                }
            }).start();
    
        }

    三、使用OKHttp实现

    /*
     * Copyright (C) 2014 Square, Inc.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package com.hotkeyfinance.finance.network;
    
    import com.squareup.okhttp.MediaType;
    import com.squareup.okhttp.MultipartBuilder;
    import com.squareup.okhttp.OkHttpClient;
    import com.squareup.okhttp.Request;
    import com.squareup.okhttp.RequestBody;
    import com.squareup.okhttp.Response;
    
    import java.io.File;
    import java.io.IOException;
    
    public final class PostMultipart {
        /**
         * The imgur client ID for OkHttp recipes. If you're using imgur for anything
         * other than running these examples, please request your own client ID!
         * https://api.imgur.com/oauth2
         */
        private static final String IMGUR_CLIENT_ID = "9199fdef135c122";
        private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    
        private final OkHttpClient client = new OkHttpClient();
    
        public void run(String url, String filePath) throws Exception {
            // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
    
            File file = new File(filePath);
    
            RequestBody requestBody = new MultipartBuilder()
                    .type(MultipartBuilder.FORM)
                    .addFormDataPart("title", "Square Logo")
                    .addFormDataPart("image", file.getName(),
                            RequestBody.create(MEDIA_TYPE_PNG, file))
                    .build();
    
            Request request = new Request.Builder()
                    .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
                    .url(url)
                    .post(requestBody)
                    .build();
    
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
    
            System.out.println(response.body().string());
        }
    
    }

    OKHttp库的地址:   https://github.com/square/okhttp

    httpmine库的地址: http://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime

  • 相关阅读:
    VS2005 新控件之 容器 《PlaceHolder》
    vs2005/.NET2.0 控件演示之 超级链接 《HyperLink》
    VS2005 控件演示之 容器《Panel》
    投票系统[单/复选,投票数量/项随意][C#/SQL/文件包括数据库代码全部在]
    datalgrid\datalist\repeater\的用法以及相关小技巧
    使用XmlDocument类完成对XML的查、删、添、改(不完美,望指教)
    Repeater读取数据并分页
    vs2005控件演示之 MultiView
    datagrid 分页及隐藏指定列再以及鼠标动作(换背景)
    VS2.0控件之日历《Calendar》C#
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7049792.html
Copyright © 2011-2022 走看看