2017-10-18 24 views
0

Je n'arrive pas à comprendre comment envoyer un objet JSON avec une image à l'intérieur, en utilisant multipart/form-data.Http POST comment envoyer JSON avec le fichier à l'intérieur en utilisant multipart/form-data

POST /api/user/update 
{ id: 123, 
    user: { logo: !!here_file!! } 
} 

J'ai essayé de mettre la chaîne base64 dans le champ de logo, et il suffit de passer cet objet JSON, mais cette approche ne fonctionne pas, le serveur a besoin de type contenu: multipart/form-data; et je ne peux pas comment faire ça. J'ai regardé beaucoup de questions, mais je n'ai pas trouvé comment publier JSON avec le fichier, et aussi ce fichier.

+0

Quelle langue utilisez-vous pour l'analyser du côté back-end? –

+0

@WalterPalladino Malheureusement, je ne gère rien du côté serveur. –

+0

J'ai ajouté du code qui fonctionne pour moi. J'espère que cela vous aide. Dans mon cas, le backend est PHP. –

Répondre

0

Ceci est une méthode générique que je utilise pour envoyer POST au backend:

/** 
* putJSONObject 
* 
* @param url 
* @param jsonObject 
* @param timeoutMillis 
* @return 
*/ 
protected static JSONObject putJSONObject (String url, JSONObject jsonObject, int timeoutMillis) throws IOException, JSONException { 

    StringBuilder stringBuilder = new StringBuilder(); 

    HttpURLConnection httpURLConnection; 
    DataOutputStream printout; 

    httpURLConnection = (HttpURLConnection) new URL (url).openConnection(); 
    httpURLConnection.setRequestMethod ("POST"); 
    httpURLConnection.setReadTimeout (timeoutMillis); 
    httpURLConnection.setConnectTimeout (timeoutMillis); 
    httpURLConnection.setDoInput (true); 
    httpURLConnection.setDoOutput (true); 
    httpURLConnection.setUseCaches (false); 
    httpURLConnection.connect(); 

    // Send POST output. 
    printout = new DataOutputStream (httpURLConnection.getOutputStream()); 
    printout.writeBytes ("msg=" + URLEncoder.encode (jsonObject.toString(), "UTF-8")); 
    printout.flush(); 
    printout.close(); 

    InputStreamReader inputStreamReader = new InputStreamReader (httpURLConnection.getInputStream()); 

    int read; 
    char[] buff = new char[4096]; 
    while ((read = inputStreamReader.read (buff)) != -1) { 
     stringBuilder.append (buff, 0, read); 
    } 
    httpURLConnection.disconnect(); 

    return new JSONObject (stringBuilder.toString()); 

} 

Le JSON envoyé est envoyé comme « msg »

et pour encoder l'image à une chaîne c'est mon code:

/** 
* toBase64 
* 
* @param bitmap 
* @return String 
*/ 
public static String toBase64 (Bitmap bitmap) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] imageBytes = baos.toByteArray(); 
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    return encodedImage; 
} 

/** 
* fromBase64 
* 
* @param encodedImage 
* @return Bitmap 
*/ 
public static Bitmap fromBase64 (String encodedImage) { 
    byte[] decodedByte = Base64.decode(encodedImage, Base64.DEFAULT); 
    return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); 
} 

Espérons que cela vous aide.

0

Dans un premier temps, vous devez changer d'approche. Avant d'envoyer un objet JSON où vous voulez, vous devez charger votre image (fichier) sur le serveur de téléchargement. Le serveur de téléchargement est un serveur où vous stockez votre image et pouvez y accéder par référence. Cela ressemble à ceci: vous téléchargez une image sur le serveur en utilisant multipart/form-data et obtenez un lien vers l'image. Ensuite, vous mettez ce lien dans votre objet JSON comme

{ 
    id: 123, 
    user: { logo: https://myuploadserver.com/img123.jpg } 
} 

Ensuite, vous pouvez le faire avec un objet JSON tout ce que vous voulez

Quelques liens vers la stackoverflow avec une description de la façon de télécharger des données vers le serveur de téléchargement à l'aide multipart/form-data:

1. simple HttpURLConnection POST file multipart/form-data
2. upload multipart form data to server