2014-01-26 2 views
0

Google 이미지 검색을 사용하여 이미지를 프로그래밍 방식으로 (안드로이드) 업로드하고 결과를 파싱하려고합니다. 계속해서 오류가 발생합니다. "이미지 형식이 .jpg, .gif, .png, .bmp, .tif 또는 .webp 중 하나 여야합니다."POST를 통해 안드로이드에서 JPEG 형식으로 이미지 업로드

브라우저에서 똑같은 작업을하면 잘 작동합니다. 내가 피들러를 통해 두 개의 요청을 비교하여 둘 다 지금까지 콘텐츠 형식에 관한 한 유사 :

Content-Type: multipart/form-data; boundary=A3EwwOwLJr168nlq1CZSlVUuQ1m5X9W 

--A3EwwOwLJr168nlq1CZSlVUuQ1m5X9W 
Content-Disposition: form-data; name="file"; filename="File_1390748740620.jpeg" 
Content-Type: image/jpeg 

나는 문제가 무엇인지 알아낼 수 없습니다입니다. 안내해주십시오. 코드는 다음과 같습니다 (코드에서 두 가지 방법을 시도했습니다).

// Approach 1: 
// ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
// Bitmap bitmap = BitmapFactory.decodeFile(fileName); 
// bitmap.compress(CompressFormat.JPEG, 100, bos); 
// byte[] data = bos.toByteArray(); 
// ByteArrayBody bab = new ByteArrayBody(data, "image/jpeg", fileName); 

// Approach 2:  
File file = new File(fileName); 
ContentBody cbFile = new FileBody(file, "image/jpeg"); 

MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
reqEntity.addPart("file", cbFile); 

HttpPost post = new HttpPost(uploadUrl); 
post.setEntity(reqEntity); 

답변

0

여기 정확히 원하는대로 있습니다.

HttpRequestWithEntity.java

import java.net.URI; 
import java.net.URISyntaxException; 

import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; 

public class HttpRequestWithEntity extends HttpEntityEnclosingRequestBase { 

    private String method; 

    public HttpRequestWithEntity(String url, String method) { 
     if (method == null || (method != null && method.isEmpty())) { 
      this.method = HttpMethod.GET; 
     } else { 
      this.method = method; 
     } 
     try { 
      setURI(new URI(url)); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String getMethod() { 
     return this.method; 
    } 

} 

그리고 여기 당신이 사진이나 동영상을 업로드 할 당신이 원하는 경우에 당신이 진행 막대를 표시 할 수 있습니다.

public static class UploadPhoto extends AsyncTask<String, Void, InputStream> { 
    private static final String TAG = "UploadImage"; 
    byte[] buffer; 
    byte[] data; 
    //private long dataLength = 0; 
    private INotifyProgressBar iNotifyProgressBar; 
    private int user_id; 
    private IAddNewItemOnGridView mAddNewItemOnGridView; 
    public UploadPhoto(INotifyProgressBar iNotifyProgressBar, 
      IAddNewItemOnGridView mAddNewItemOnGridView, int user_id) { 
     this.iNotifyProgressBar = iNotifyProgressBar; 
     this.user_id = user_id; 
     this.mAddNewItemOnGridView = mAddNewItemOnGridView; 
    } 

    @Override 
    protected InputStream doInBackground(String... names) { 
     File mFile = null; 
     FileBody mBody = null; 
     File dcimDir = null; 
     try { 
      String fileName = names[0]; 
      dcimDir = Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
      mFile = new File(dcimDir, Def.PHOTO_TEMP_DIR + fileName); 
      if (!mFile.isFile()) { 
       iNotifyProgressBar.notify(0, UploadStatus.FAILED); 
       return null; 
      } 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost postRequest = new HttpPost(Def.BASE_URL 
        + String.format("/%d/list", this.user_id)); 
      final int maxBufferSize = 10 * 1024; 
      mBody = new FileBody(mFile, fileName, "image/jpeg", "UTF-8"){ 
       int bytesRead, bytesAvailable, bufferSize; 
       InputStream mInputStream = super.getInputStream(); 
       int dataLength = mInputStream.available(); 
       @Override 
       public void writeTo(OutputStream out) throws IOException { 
        bytesAvailable = mInputStream.available(); 
        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        buffer = new byte[bufferSize]; 
        bytesRead = mInputStream.read(buffer, 0, bufferSize); 
        while (bytesRead > 0) { 
         out.write(buffer, 0, bufferSize); 
         bytesAvailable = mInputStream.available(); 
         bufferSize = Math.min(bytesAvailable, maxBufferSize); 
         bytesRead = mInputStream.read(buffer, 0, bufferSize); 
         int progress = (int) (100 - ((bytesAvailable * 1.0)/dataLength) * 100); 
         Log.d(TAG, "Result: " + progress + "%"); 
         if (progress == 100) { 
          iNotifyProgressBar.notify(progress, UploadStatus.SUCCESS); 
         } else { 
          iNotifyProgressBar.notify(progress, UploadStatus.UPLOADING); 
         } 
        } 
       } 
       @Override 
       protected void finalize() throws Throwable { 
        super.finalize(); 
        if (mInputStream != null) { 
         mInputStream.close(); 
        } 
       } 
      }; 

      MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);    
      reqEntity.addPart("photo", mBody); 
      postRequest.setEntity(reqEntity); 
      HttpResponse response = httpClient.execute(postRequest); 
      InputStream mInputStream = response.getEntity().getContent(); 
      return mInputStream == null ? null : mInputStream; 
     } catch (IOException e) { 
      Log.e(TAG, "Error causes during upload image: " + e.getMessage()); 
      e.printStackTrace(); 
      iNotifyProgressBar.notify(0, UploadStatus.FAILED); 
     } finally { 
      Log.v(TAG, "Close file"); 
      if (mFile != null) { 
       mFile = null; 
      } 
      if (mBody != null) { 
       mBody = null; 
      } 
      if (dcimDir != null) { 
       dcimDir = null; 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(InputStream result) { 
     if (result == null) { 
      iNotifyProgressBar.notify(0, UploadStatus.FAILED); 
     } else { 
      PhotoInfo mPhotoInfo = ApiUtils.convertStreamToPhotoInfo(result); 
      if (mAddNewItemOnGridView != null && mPhotoInfo != null) { 
       mAddNewItemOnGridView.notifyAdded(mPhotoInfo); 
       Log.d(TAG, "Upload completed!!"); 
      } else { 
       Log.d(TAG, "Upload is failed!!"); 
       iNotifyProgressBar.notify(0, UploadStatus.FAILED); 
      } 
     } 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
} 
관련 문제