图片上传 - Android上传图片到Java服务端出现的问题
问题描述
我在Android端上传图片的时候URL如果使用的内网IP,用内部网络上传图片的时候是没有问题的,但是如果我Android端URL使用外网IP的话,只能使用公司内部网络才能正确上传,用自己流量或其他外部网络只能上传几十k的图片,上传大一点的就上传不了。之前觉得可能是外网有什么限制,但是今天在家通过服务端的测试页面(如下图)上传图片,也成功了,所以感觉外网应该也没有什么限制,实在不知道是什么原因了,有大神知道吗?急求答案,谢谢!试过用Socket上传,也是一样的情况,会出现一样的问题。
Android端代码:
public class HttpUpLoadImageUtil { static String BOUNDARY = java.util.UUID.randomUUID().toString(); static String PREFIX = '--', LINEND = 'rn'; 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('rn'); text.append('Content-Disposition: form-data; name=''+ entry.getKey() + ''rnrn'); text.append(entry.getValue()); text.append('rn');}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(); }}
问题解答
回答1:能成功的话代码出问题的可能性是不大的,如果要是出错了至少需要得到错误信息才能排查。
相关文章:
1. css3 - 一篇文章有好多段 怎么控制整篇文章显示多少行 剩余省略 而不是每段控制2. 数据库创建失败3. PHP类中的$this4. javascript - 关于圣杯布局的一点疑惑5. css3 - Firefox 字号相对IE、Chrome更大,如何在CSS中统一?6. android - coordinatorLayout嵌套recyclerview7. javascript - 在html中写了个<video>视频,浏览器却是一片空白为什么呢?360浏览器?8. vue.js - weex scroller搭配refresh在android平台上拉会触发refresh9. Python Tornado批量上传图片并显示功能10. node.js - 使用npm安装vue-cli后,vue还是不可用是什么原因?