Intereting Posts
Как показать кнопку изображения только на определенных строках Как опубликовать Android-библиотеку в Android Arsenal? Как я могу ограничить показ в галерее Android только одним элементом для броска? Могу ли я копировать между CouchBase на Android и Couch DB, работающим в Linux? Приложение закрыто после нажатия кнопки «Назад» в фрагменте ANDroid – Запустите файл APK после редактирования с помощью ошибки apktool get: OpenCV 2.4.1: UnsatisfiedLinkError Samsung Note 2 не может достичь onLocationChanged () Как получить доступ к файлам Lollipop для файлов Android через NDK? Java (Android): Как масштабировать выделение без растрового изображения? Невозможно получить представление действий для ActionBar MenuItem с помощью библиотеки поддержки Предупреждение SimpleDateFormat Чтобы получить локальное форматирование, используйте getDateInstance (), getDateTimeInstance () или getTimeInstance (), RecyclerView отсутствует Как добавить элемент раскрывающегося списка на панели действий Интеграция моего виджета с моим приложением

Как использовать изображение / изображение с загрузкой multipart / form-data на Android

Это мой код.

У меня ошибка Http 400, может кто-нибудь мне помочь?

HttpClient httpClient; HttpPost httpPost; HttpResponse response; HttpContext localContext; FileEntity tmp = null; String ret = null; httpClient = new DefaultHttpClient( ); httpClient.getParams().setParameter( ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109) ; httpPost = new HttpPost(url); tmp = new FileEntity( data,"UTF-8" ); httpPost.setEntity( tmp ); httpPost.setHeader( "Content-Type", "multipart/form-data" ); httpPost.setHeader( "access_token", facebook.getAccessToken( ) ); httpPost.setHeader( "source", data.getAbsolutePath( ) ); httpPost.setHeader( "message", "Caption for the photo" ); localContext = new BasicHttpContext( ); response = httpClient.execute( httpPost,localContext ); 

Bobince, спасибо, это мой новый идентификатор, я попробую поставить OAuth в свой заголовок соединения.

И это мой старый код, я скоро его обновлю.

 private void uploadPicture( ) throws ParseException, IOException { HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams( ).setParameter( CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1 ); HttpPost httppost = new HttpPost( "https://graph.facebook.com/me/photos" ); File file = new File( sdpicturePath ); // DEBUG Log.d( "TSET", "FILE::" + file.exists( ) ); // IT IS NOT NULL Log.d( "TEST", "AT:" + fbAccessToken ); // I GOT SOME ACCESS TOKEN MultipartEntity mpEntity = new MultipartEntity( ); ContentBody cbFile = new FileBody( file, "image/png" ); ContentBody cbMessage = new StringBody( "TEST TSET" ); ContentBody cbAccessToken = new StringBody( fbAccessToken ); mpEntity.addPart( "access_token", cbAccessToken ); mpEntity.addPart( "source", cbFile ); mpEntity.addPart( "message", cbMessage ); httppost.setEntity( mpEntity ); // DEBUG System.out.println( "executing request " + httppost.getRequestLine( ) ); HttpResponse response = httpclient.execute( httppost ); HttpEntity resEntity = response.getEntity( ); // DEBUG System.out.println( response.getStatusLine( ) ); if (resEntity != null) { System.out.println( EntityUtils.toString( resEntity ) ); } // end if if (resEntity != null) { resEntity.consumeContent( ); } // end if httpclient.getConnectionManager( ).shutdown( ); } // end of uploadPicture( ) 

setEntity задает источник всего тела запроса, поэтому это будет работать только в том случае, если файл data был уже закодированным блоком multipart/form-data .

Чтобы создать заявку на получение многофайловой multipart/form-data кодированной формы для использования в качестве тела запроса POST, вам понадобится многопроходный кодер MIME, обычно org.apache.http.entity.mime.MultipartEntity . К сожалению, это не связано с Android, поэтому, если вы этого хотите, вам придется вытащить новый HttpClient из Apache.

См. Этот вопрос, например, код и этот поток для фона.

Есть мое рабочее решение для отправки изображения с сообщением, используя apache http-библиотеки:

  ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] imageBytes = baos.toByteArray(); HttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP); String boundary = "-------------" + System.currentTimeMillis(); httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary); ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png"); StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN); StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN); HttpEntity entity = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .setBoundary(boundary) .addPart("group", sbGroup) .addPart("owner", sbOwner) .addPart("image", bab) .build(); httpPost.setEntity(entity); try { HttpResponse response = httpclient.execute(httpPost); ...then reading response 

Как и для facebook graph api, этот код работает отлично. Однако иногда вам нужно использовать имя вместо имени файла , похоже, что диаграмма api конфликтует с документом rfc.

 final String BOUNDERY = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; final String CRLF = "\r\n"; StringBuilder sbBody_1 = new StringBuilder(); sbBody_1.append("--" + BOUNDERY + CRLF); sbBody_1.append("Content-Disposition: form-data; filename=\"source\"" + CRLF); sbBody_1.append(CRLF); StringBuilder sbBody_2 = new StringBuilder(); sbBody_2.append(CRLF + "--" + BOUNDERY + "--"); URL url = new URL("https://graph.facebook.com/me/photos?access_token=" + accessToken); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDERY); connection.setChunkedStreamingMode(0); OutputStream out = new BufferedOutputStream(connection.getOutputStream()); out.write(sbBody_1.toString().getBytes()); out.write(bFile);// bFile is byte array of the bitmap out.write(sbBody_2.toString().getBytes()); out.close(); BufferedReader bips = new BufferedReader(new InputStreamReader(connection.getInputStream())); String temp = null; while ((temp = bips.readLine()) != null) { Log.d("fbnb", temp); } bips.close(); connection.disconnect();