Lorsque je télécharge des images côté Android, si l'URL utilise une IP intranet, il n'y a aucun problème lors du téléchargement d'images en utilisant le réseau interne. Cependant, si l'URL côté Android utilise une IP de réseau externe, je ne peux utiliser que l'adresse IP du réseau interne. réseau interne de l'entreprise pour télécharger correctement , vous ne pouvez télécharger que des dizaines de kilo-octets d'images en utilisant votre propre trafic ou d'autres réseaux externes, mais vous ne pouvez pas en télécharger de plus grandes. Je pensais qu'il pourrait y avoir certaines restrictions sur le réseau externe, mais aujourd'hui, j'ai téléchargé des photos via la page de test du serveur (comme indiqué ci-dessous) chez moi, et cela a réussi, donc je pense qu'il ne devrait y avoir aucune restriction sur le réseau externe. Je ne sais vraiment pas quelle est la raison. J'ai besoin d'une réponse de toute urgence, merci ! J'ai essayé de télécharger en utilisant Socket, mais c'était la même situation et le même problème s'est produit.
Code Android :
public class HttpUpLoadImageUtil { static String BOUNDARY = java.util.UUID.randomUUID().toString(); static String PREFIX = "--", LINEND = "\r\n"; static String MULTIPART_FROM_DATA = "multipart/form-data"; static String CHARSET = "UTF-8"; public static void doPostPicture(String urlStr, Map paramMap, File pictureFile ) throws Exception{ URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); conn.setReadTimeout(10 * 1000); // 缓存的最长时间 conn.setRequestMethod("POST"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); DataOutputStream os = new DataOutputStream(conn.getOutputStream()); StringBuilder sb = new StringBuilder(); //用StringBuilder拼接报文,用于上传图片数据 sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + pictureFile.getName() + "\"" + LINEND); sb.append("Content-Type: image/jpg; charset=" + CHARSET + LINEND); sb.append(LINEND); os.write(sb.toString().getBytes()); InputStream is = new FileInputStream(pictureFile); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); //写入图片数据 } is.close(); os.write(LINEND.getBytes()); StringBuilder text = new StringBuilder(); for(Map.Entry entry : paramMap.entrySet()) { //在for循环中拼接报文,上传文本数据 text.append("--"); text.append(BOUNDARY); text.append("\r\n"); text.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n"); text.append(entry.getValue()); text.append("\r\n"); } os.write(text.toString().getBytes("utf-8")); //写入文本数据 // 请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); os.write(end_data); os.flush(); os.close(); // 得到响应码 int res = conn.getResponseCode(); System.out.println("asdf code "+ res); System.out.println("asdf " + conn.getResponseMessage()); conn.disconnect(); } }
Si cela réussit, il est peu probable qu'il y ait un problème avec le code. Si quelque chose ne va pas, vous devez au moins recevoir le message d'erreur pour résoudre le problème.