关于 android 选择多张图片进行上传的

倾城一哥 发布于 2013/08/30 12:58
阅读 22K+
收藏 0
android 选择多张图片进行上传的 在网上找了也没有例子 本人菜鸟啊 望大神给个demo啊

以下是问题补充:

@倾城一哥:类似QQ空间那种 把相册里的图片文件夹展现 点击选择在下面出现显示出来可以滑动 (2013/08/30 13:24)
加载中
0
skjda
skjda

多张图片上传没有做过,不过单张做过很多;你是不是考虑一张一张传,做一个队列;图片大的话做成表单式,附代码一段;

        private static int readTimeOut = 10 * 1000;
	private static int connectTimeout = 10 * 1000;
	private static final String CHARSET = "utf-8";
	private static final String PREFIX = "--";
	private static final String LINE_END = "\r\n";
	private static final String BOUNDARY = UUID.randomUUID().toString();
	private static final String CONTENT_TYPE = "multipart/form-data";

	public static String toUploadFile(byte[] file, String RequestURL,
			Map<String, String> param) {

		try {
			URL url = new URL(RequestURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setReadTimeout(readTimeOut);
			conn.setConnectTimeout(connectTimeout);
			conn.setDoInput(true); // 允许输入流
			conn.setDoOutput(true); // 允许输出流
			conn.setUseCaches(false); // 不允许使用缓存
			conn.setRequestMethod("POST"); // 请求方式
			conn.setRequestProperty("Charset", CHARSET); // 设置编码
			conn.setRequestProperty("Cookie", "PHPSESSID="
					+ HttpDetailUtil.PHPSESSID);
			conn.setRequestProperty("connection", "keep-alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 ("
					+ "compatible; MSIE 6.0; Windows NT 5.1; SV1)");
			conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary="
					+ BOUNDARY);

			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
			StringBuffer sb = null;

			if (param != null && param.size() > 0) {
				Iterator<String> it = param.keySet().iterator();
				while (it.hasNext()) {
					sb = null;
					sb = new StringBuffer();
					String key = it.next();
					String value = param.get(key);
					sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
					sb.append("Content-Disposition: form-data; name=\"")
							.append(key).append("\"").append(LINE_END)
							.append(LINE_END);
					sb.append(value).append(LINE_END);
					dos.write(sb.toString().getBytes());
				}
			}

			sb = null;
			sb = new StringBuffer();
			sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
			sb.append("Content-Disposition:form-data; name=\"image\"; "
					+ "filename=\"" + HttpDetailUtil.UserDetail.nickname + "_"
					+ System.currentTimeMillis() + ".png\"" + LINE_END);
			sb.append("Content-Type: application/octet-stream" + LINE_END);
			sb.append(LINE_END);

			dos.write(sb.toString().getBytes());
//			byte[] bytes = new byte[1024];
//			int length = file.length;
//			int len = length / 1024;
//			for (int i = 0; i < len; i++) {
//				System.arraycopy(file, i * 1024, bytes, 0, 1024);
//				dos.write(bytes);
//			}
//			if (length % 1024 != 0) {
//				dos.write(bytes, 0, length % 1024);
//			}
			dos.write(file);
			dos.write(LINE_END.getBytes());
			byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)
					.getBytes();
			dos.write(end_data);
			dos.flush();

			int res = conn.getResponseCode();
			if (res == 200) {
				InputStream input = conn.getInputStream();
				sb = new StringBuffer();
				int ss = -1;
				while ((ss = input.read()) != -1) {
					sb.append((char) ss);
				}
				return sb.toString();
			} else {
				return "";
			}
		} catch (MalformedURLException e) {
			return "";
		} catch (IOException e) {
			return "";
		}
	}

中间注释部分可以放开后,你需要修改,中间有bug,图片内容重了,没来得及修改。

dos.write(sb.toString().getBytes());
需要注释掉,因为 DataOutputStream中间长字段会有些问题,具体你可以试试。

上传成功后,返回一个status给客户端就可以传下一张图片了。

0
倾城一哥
倾城一哥
我是纠结那个多图的选择 不会弄
0
skjda
skjda

引用来自“倾城一哥”的答案

我是纠结那个多图的选择 不会弄
QQ的没注意,好久不用手机QQ了。不好意思。
0
A
Arlen_
多图选择和多图同时上传,压缩到1M以下上传不失真,自定义图库和大图预览https://github.com/736008081/uploadPhoto
碎节风雷
碎节风雷
朋友,非常感谢你提供的范例,但当我直接将你的demo运行到手机上时,每次点击拍照按钮,都提示:“无法生成照片,请检查存储空间是否足够”,换了好几部手机都这样,无解
返回顶部
顶部