Apabila saya memuat naik gambar di bahagian Android, jika URL menggunakan IP intranet, tiada masalah apabila memuat naik gambar menggunakan rangkaian dalaman Namun, jika URL di bahagian Android menggunakan IP rangkaian luaran, saya hanya boleh menggunakan rangkaian dalaman syarikat untuk memuat naik dengan betul , anda hanya boleh memuat naik berpuluh-puluh kilobait gambar menggunakan trafik anda sendiri atau rangkaian luaran lain, tetapi anda tidak boleh memuat naik yang lebih besar. Saya pernah berfikir bahawa mungkin terdapat beberapa sekatan pada rangkaian luaran, tetapi hari ini saya memuat naik gambar melalui halaman ujian pelayan (seperti yang ditunjukkan di bawah) di rumah, dan ia berjaya, jadi saya merasakan bahawa tidak perlu ada sekatan pada rangkaian luaran Saya benar-benar tidak tahu apa sebabnya. Saya perlukan jawapan segera, terima kasih! Saya cuba memuat naik menggunakan Socket, tetapi ia adalah situasi yang sama dan masalah yang sama berlaku.
Kod 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<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();
}
}
Jika ia berjaya, tidak mungkin terdapat masalah dengan kod Jika berlaku masalah, sekurang-kurangnya anda perlu mendapatkan mesej ralat untuk menyelesaikan masalah.