2011-08-15 9 views
1

私は投稿経由で写真をアップロードする機能があります。私はファイルをうまくアップロードすることができますが、POSTにキー/値のペアを追加する方法についてはわかりませんが、基本的にはAPIキーとセッションキーをファイルデータと共に取得する必要があります。アンドロイドでファイルをアップロードして定期的な投稿キーと値のペアを送信するには

public ContainerData submitPhoto(FileInputStream fileInputStream, String sessionKey) { 

    try { 

     URL url = new URL(API_URL); 

     HttpURLConnection conn = null; 

     if (url.getProtocol().toLowerCase().equals("https")) { 
      trustAllHosts(); 
      HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); 
      https.setHostnameVerifier(DO_NOT_VERIFY); 
      conn = https; 
     } else { 
      conn = (HttpURLConnection) url.openConnection(); 
     } 


     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 

     // HttpURLConnection conn = (HttpURLConnection) 
     // connectURL.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("Connection", "Keep-Alive"); 

     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

     DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + "file.png" + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 

     // create a buffer of maximum size 

     int bytesAvailable = fileInputStream.available(); 
     int maxBufferSize = 1028; 
     int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     byte[] buffer = new byte[bufferSize]; 

     // read file and write it into form... 

     int 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); 
      /* 
      * dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary 
      * + twoHyphens + lineEnd); 
      */ 
     } 

     // send multipart form data necesssary after file data... 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
     dos.flush(); 
     // Log.d(TAG, " dos5: " + dos.toString()); 
     InputStream is = conn.getInputStream(); 
     // retrieve the response from server 
     int ch; 

     StringBuffer b = new StringBuffer(); 
     while ((ch = is.read()) != -1) { 
      b.append((char) ch); 
     } 
     String stringResponse = b.toString(); 
     // Log.d(TAG, "http response for upload" + s); 
     dos.close(); 

     Gson gson = new GsonBuilder().serializeNulls().create(); 
     responseObject = gson.fromJson(stringResponse,ContainerData.class); 

     JSONObject data = new JSONObject(stringResponse); 
     String dataResponse = data.getString("data"); 
     responseObject.setDataString(dataResponse); 


    } catch (JSONException e) { 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return responseObject; 

} 

答えて

1

RFC 1867の形式を指定します。

Content-type: multipart/form-data, boundary=AaB03x 

--AaB03x 
content-disposition: form-data; name="field1" 

Joe Blow 
--AaB03x 
content-disposition: form-data; name="pics"; filename="file1.txt" 
Content-Type: text/plain 

... contents of file1.txt ... 
--AaB03x-- 

あなたのコードを持つ2つの追加的な問題:リンクから

1)私が面倒で遅い反復ごとにバッファを再発見します。ループの前に最大サイズでそれを薄暗くして再利用してください。

2)また、データバイトを直接送信すると危険があります(ピクチャの2バイトがセパレータと同じ値の場合はどうすればよいですか?)私はbase64エンコードを使用することをお勧めします。

関連する問題