Android Httpはファイルのアップロードとダウンロードを実現します。


最近のプロジェクトでは、ファイルのアップロードとダウンロードの機能については、みんなが知っていますが、この機能は実際にはすでに壊れています。そして、直接にネットでコードをいっぱい使いました。もっと多くの人が利用されますように。
ファイルアップロード
org.apache.com mmons.httpclient.Http Clientを通じてファイルのアップロードを実現します。

  /**
   * @param mContext    
   * @param targetUrl       
   * @param filePath     
   */
  public void uploadFile(final Activity mContext, String targetUrl, final String filePath) {

    System.out.println("targetUrl: " + targetUrl + " filePath: " + filePath);

    if (TextUtils.isEmpty(filePath)) {
      Toast.makeText(mContext, "     ", Toast.LENGTH_SHORT).show();
      return;
    }

    final PostMethod filePost = new PostMethod(targetUrl) {//        
      public String getRequestCharSet() {
        return "UTF-8";
      }
    };

    try {

      final HttpClient client = new HttpClient();

      File file = new File(filePath);

      if (file.exists() && file.isFile()) {

        long fileSize = file.length();

        if (fileSize >= 5 * 1024 * 1024) {
          Toast.makeText(mContext, "      5M", Toast.LENGTH_SHORT).show();
          return;
        }

      } else {
        Toast.makeText(mContext, "     ", Toast.LENGTH_SHORT).show();

        return;
      }

      //        
      Part[] parts = new Part[]{new CustomFilePart(file.getName(), file),
          new StringPart("filename", file.getName(), "UTF-8")};
      filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

      new Thread(new Runnable() {

        @Override
        public void run() {

          int statuscode = 0;

          try {
            statuscode = client.executeMethod(filePost);
          } catch (IOException e) {
            e.printStackTrace();
          }

          final int finalStatuscode = statuscode;

          mContext.runOnUiThread(new Runnable() {

            @Override
            public void run() {
              if (finalStatuscode == HttpStatus.SC_OK) {
                Toast.makeText(mContext, "    ", Toast.LENGTH_SHORT).show();
              } else {
                Toast.makeText(mContext, "    ", Toast.LENGTH_SHORT).show();
              }
            }
          });
        }

      }).start();

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

Http Clientの使用は、しばしば文字化けの問題に遭遇します。私たちは主に二つのところで文字化けの問題を解決します。
 •PostMethodのget Request CharSetを複写し、要求符号化を指定します。

 final PostMethod filePost = new PostMethod(targetUrl) {//        
      public String getRequestCharSet() {
        return "UTF-8";
      }
    };
 •カスタムFilePart、指定要求パラメータ符号化

 /**
 *          
 */
public class CustomFilePart extends FilePart {
  public CustomFilePart(String filename, File file)
      throws FileNotFoundException {
    super(filename, file);
  }

  protected void sendDispositionHeader(OutputStream out) throws IOException {
    super.sendDispositionHeader(out);
    String filename = getSource().getFileName();
    if (filename != null) {
      out.write(EncodingUtil.getAsciiBytes(FILE_NAME));
      out.write(QUOTE_BYTES);
      out.write(EncodingUtil.getBytes(filename, "UTF-8"));
      out.write(QUOTE_BYTES);
    }
  }
}

Custoom FilePartを使用してパラメータを追加します。

Part[] parts = new Part[]{new CustomFilePart(file.getName(), file),
          new StringPart("filename", file.getName(), "UTF-8")};
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

ファイルのダウンロード
HttpURLConnectionを通じてファイルをダウンロードします。

  /**
   * @param urlStr      
   * @param path         
   * @param fileName    
   * @return        
   */
  public String downFile(String urlStr, String path, String fileName) {

    InputStream inputStream = null;
    String filePath = null;

    try {
      FileUtils fileUtils = new FileUtils();
      //        
      if (fileUtils.isFileExist(path + fileName)) {
        System.out.println("exits");
        filePath = SDPATH + path + fileName;
      } else {
        //  io 
        inputStream = getInputStreamFromURL(urlStr);
        // input       SD  
        File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
        if (resultFile != null) {

          filePath = resultFile.getPath();
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (inputStream != null)
          inputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return filePath;
  }

  /**
   *   URL     
   *
   * @param urlStr
   * @return
   */
  public InputStream getInputStreamFromURL(String urlStr) {

    HttpURLConnection urlConn;
    InputStream inputStream = null;
    try {
      url = new URL(urlStr);
      urlConn = (HttpURLConnection) url.openConnection();
      inputStream = urlConn.getInputStream();

    } catch (Exception e) {
      e.printStackTrace();
    }

    return inputStream;
  }

ファイルのダウンロードは簡単です。つまりHTTPでInputStreamを取得し、InputStreamを解析してファイルに書き込むだけです。
Input streamを読み込み、SDCardに書き込みます。

/**
   *    InputStream        SD  
   *
   * @param path       
   * @param fileName        
   * @param input      
   * @return   
   */
  public File write2SDFromInput(String path, String fileName,
                 InputStream input) {
    File file = null;
    OutputStream output = null;
    try {
      //      
      createSDDir(path);
      //     
      file = createSDFile(path + fileName);

      //      ,      
      output = new FileOutputStream(file);
      //    
      byte[] buffer = new byte[FILESIZE];
      int count;
      while ((count = input.read(buffer)) != -1) {
        //   ,           ,             ,      
        output.write(buffer, 0, count);
      }
      output.flush();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        output.close();
        input.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return file;
  }

Inputstreamをsdcardカードに書き込みます。重要なところがあります。まずOutputStreamのwrite方法を見てください。
第二の方法を紹介します。データの紛失を防ぐためです。ファイルコードは以下の通りです。

 while ((count = input.read(buffer)) != -1) {
 //   ,           ,             ,      
 output.write(buffer, 0, count);
}

ソースの住所:https://github.com/zuiwuyuan/Http_Uploader_Downloader
以上は私が整理したAndroid Httpファイルのアップロードとダウンロード方法です。