Wenn ich Bilder auf der Android-Seite hochlade und die URL eine Intranet-IP verwendet, gibt es kein Problem beim Hochladen von Bildern über das interne Netzwerk. Wenn die URL auf der Android-Seite jedoch eine externe Netzwerk-IP verwendet, kann ich nur die verwenden Um das interne Netzwerk des Unternehmens ordnungsgemäß hochzuladen, können Sie nur Dutzende Kilobyte an Bildern über Ihren eigenen Datenverkehr oder andere externe Netzwerke hochladen, größere Bilder sind jedoch nicht möglich. Früher dachte ich, dass es im externen Netzwerk einige Einschränkungen geben könnte, aber heute habe ich zu Hause Bilder über die Testseite des Servers (wie unten gezeigt) hochgeladen und es war erfolgreich, daher bin ich der Meinung, dass es keine Einschränkungen geben sollte Das externe Netzwerk weiß wirklich nicht, was der Grund ist. Ich brauche dringend eine Antwort, danke! Ich habe versucht, mit Socket hochzuladen, aber es war die gleiche Situation und das gleiche Problem ist aufgetreten.
Android-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();
}
}
能成功的话代码出问题的可能性是不大的,如果要是出错了至少需要得到错误信息才能排查。