2012-01-10 3 views
5

카메라로 이미지 캡처를 서버에 업로드하려고합니다. 서버가 응답 코드 = 200을 보내지 만 이미지가 서버로 업로드되지 않습니다.Android에서 서버로 이미지를 업로드하는 방법은 무엇입니까?

코드는 다음과 같습니다

private boolean uploadData() { 

    int count = this.forumThreadsB.size(); 
    for (int i = 0; i < count; i++) 
    { 
      if (isPhoto) 
       message = "Uploading Shared Items " + (i + 1) + " of " + count; 
      else 
       message = "Uploading Shared Items " + (i + 1) + " of " + count; 

      progressCount = (i * 1000)/count; 
      Hashtable<?, ?> threadD = (Hashtable<?, ?>)this.forumThreadsB.elementAt(i); 

      String onlinePath = "http://xyx.com/; 
      threadid = (String) threadD.get("devicethreadid"); 
      Hashtable<String, String> pairs = new Hashtable<String, String>(); 
      pairs.put("forumid", threadD.get("lmsforumid").toString()); 
      pairs.put("topicid", threadD.get("lmsthreadid").toString()); 
      pairs.put("clientid", LoginHelper.clientid); 
      String fullfilepath = threadD.get("offlinepath").toString(); 
      int index = threadD.get("offlinepath").toString().lastIndexOf("/"); 

      String filename = fullfilepath.substring(index + 1); 
      String filetype = ""; 

      if (filename.toLowerCase().contains(".png")) 
       filetype = "image/png"; 
      else if (filename.toLowerCase().contains(".jpg")) 
       filetype = "image/jpeg"; 
      else if (filename.toLowerCase().contains(".mp4")) 
       filetype = "image/mp4"; 
      else if (filename.toLowerCase().contains(".3gp")) 
       filetype = "image/3gpp"; 



      String boundaryMessage = getBoundaryMessage(BOUNDARY, pairs, fullfilepath, filename, filetype); 
      String endBoundary = "\r\n--" + BOUNDARY + "--\r\n"; 

      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      int bytesRead, bytesAvailable, bufferSize; 
      byte[] buffer; 
      int maxBufferSize = 1*1024*1024; 

      try 
      { 
       URL url = new URL(onlinePath); 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); 
       conn.setDoOutput(true); 
       conn.setUseCaches(false); 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+BOUNDARY); 
       dos = new DataOutputStream(conn.getOutputStream()); 
       dos.write(boundaryMessage.getBytes()); 
       File file = new File(fullfilepath.substring(6)); 
       FileInputStream fileInputStream = new FileInputStream(file); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       buffer = new byte[bufferSize]; 
       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.write(endBoundary.getBytes()); 
       dos.flush(); 
       dos.close(); 
       fileInputStream.close(); 
       } catch (IOException ioe) { 
        Log.e("SyncUploadDownloadHelper", "Cannot upload file: " + ioe.getMessage(), ioe); 
        //return false; 
       } 

       // Read response 
       try { 
        int responseCode = conn.getResponseCode(); 
        if(responseCode == 200){ 

         SQLiteForumDAO forumDAO = new SQLiteForumDAO(mcontext) ; 
          ForumThreadDTO forumThreadDTO = forumDAO.selectThread(this.threadid); 
          if(downloadPath!=null && downloadPath.equalsIgnoreCase("null") && downloadPath.equalsIgnoreCase("")) 
          forumThreadDTO.offlinefilepath = downloadPath; 
          forumDAO.updateThread(forumThreadDTO); 


        } 


       } catch (IOException ioex) { 
        Log.e("SyncUploadDownloadHelper", "Upload file failed: " + ioex.getMessage(), ioex); 
        //return false; 
       } catch (Exception e) { 
        Log.e("SyncUploadDownloadHelper", "Upload file failed: " + e.getMessage(), e); 
        //return false; 
       } 

       if (i == (this.forumThreadsB.size() - 1)){ 
        this.sendStatus = "true"; 
        progressCount = 1000; 
        SyncUploadDownloadHelper.this.notifyObservers("SyncUploadDownloadHelper:UploadDataFinish"); 
       } 
       else 
        SyncUploadDownloadHelper.this.notifyObservers("SyncUploadDownloadHelper:UploadData"); 

       //return true; 

    } 

    return true; 
} 

기능 :

private String getBoundaryMessage(String boundary, Hashtable<String, String> params, String fileField, String fileName, String fileType) { 
     StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n"); 
     Enumeration<String> keys = params.keys(); 
     while(keys.hasMoreElements()) { 
     String key = (String)keys.nextElement(); 
     String value = (String)params.get(key); 

     System.out.println(key + ": " + value); 

     res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n")  
     .append("\r\n").append(value).append("\r\n").append("--").append(boundary).append("\r\n"); 
     } 
     res.append("Content-Disposition: form-data; name=\"").append("file").append("\"; filename=\"").append(fileName).append("\"\r\n") 
     .append("Content-Type: ").append(fileType).append("\r\n\r\n"); 

     return res.toString(); 
    } 

내 응용 프로그램에서 나는 이미지를 캡처하고 데이터베이스에 저장합니다. 저장 이미지의 경로는 이미지 파일을 업로드하는 데 사용됩니다.

답변

4

것은 나는 이것을 사용 :

public class HttpClient extends AsyncTask<Void, Integer, Long> { 
    private static final int PROGRESS_DIALOG = 0; 

    public ProgressDialog dialog; 
    public File file; 
    protected Long doInBackground(Void... params) { 
     for (File file : files) { 

      foto = "/sdcard/CameraExample/" + file.getName(); 
      DefaultHttpClient httpclient = new DefaultHttpClient(); 

      HttpPost httppost = new HttpPost(urll); 



      MultipartEntity mpEntity = new MultipartEntity(
        HttpMultipartMode.BROWSER_COMPATIBLE); 

      mpEntity.addPart("form_file", new FileBody(file, "image/jpeg")); 

      httppost.setEntity(mpEntity); 

      HttpResponse response; 
      try { 

       response = httpclient.execute(httppost); 

       HttpEntity resEntity = response.getEntity(); 

       if (resEntity != null) { 

       } 
       if (resEntity != null) { 
        resEntity.consumeContent(); 
       } 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 



     } 
     return null; 
    } 

    protected void onPostExecute(Long unused) { 
     progressDialog.dismiss(); 

     ((Runnable) ctx).run(); 

     super.onPostExecute(unused); 
    } 

    protected void onPreExecute() { 
    progressDialog = new ProgressDialog(ctx); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressDialog.setMessage("Загрузка фото..."); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(count); 
    progressDialog.show(); 
    } 

} 

이 코드는 그 라이브러리를 사용 : 당신은 구글이를 찾을 수 있습니다

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 
import org.apache.james.mime4j.message.Message; 

. 찾지 못했다면 - 나는이 라이브러리를 보낼 수 있습니다.

+0

@Prashant Kadam에서 라이브러리를 다운로드 할 수 있습니다 (http://grepcode.com/snapshot/repo1.maven.org/maven2/org.apache.httpcomponents/httpmime/4.0-beta2/). –