If the URL uses an intranet IP when uploading pictures on the Android side, there will be no problem when uploading pictures using the internal network. However, if the URL on the Android side uses an external network IP, it can only be done using the company's internal network. If you upload it correctly, you can only upload tens of kilobytes of images using your own traffic or other external networks, but you cannot upload larger ones. I used to think that there might be some restrictions on the external network, but today I uploaded pictures through the test page of the server (as shown below) at home, and it was successful, so I feel that there should be no restrictions on the external network. I really don’t know the reason. Does anyone know? ? I need an answer urgently, thank you! I tried uploading using Socket, but it was the same situation and the same problem occurred.
Android side code:
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<String,Object> 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<String,Object> 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();
}
}
If it succeeds, it is unlikely that there will be a problem with the code. If something goes wrong, at least you need to get the error message to troubleshoot.