这里我引用一下网上其他一些大神的截图:
我的理解是简单点说文件的上传归根结底是数据的拼接,转化为2进制流传给服务器,对照截图,看代码
public class UploadUtil {
private static final int TIME_OUT = 10 * 1000; //超时时间
private static final String CHARSET = "utf-8"; //设置编码
private static ImageSendDomain imageSendDomain;
private static String result = null;
static String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成
private static String PREFIX = "--", LINE_END = "\r\n";
static String CONTENT_TYPE = "multipart/form-data"; //内容类型
private static DataOutputStream dos = null;
private static HttpURLConnection conn;
public static int res;
/**
* android上传文件到服务器
*
* @param pathList
* @param files
* @param RequestURL 请求的rul @return 返回响应的内容
*/
public static String uploadFile(ArrayList<ImageItem> pathList, String RequestURL, FormFile[] files) {
try {
URL url = new URL(RequestURL);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true); //允许输入流
conn.setDoOutput(true); //允许输出流
conn.setUseCaches(false); //不允许使用缓存
conn.setRequestMethod("POST"); //请求方式
conn.setRequestProperty("Charset", CHARSET); //设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
conn.connect();
dos = new DataOutputStream(conn.getOutputStream());
for (FormFile file1 : files) {
dos.writeBytes(PREFIX + BOUNDARY + LINE_END);
dos.writeBytes("Content-Disposition: form-data; name=\"img\"; filename=\""
+ file1.getFilname().substring(file1.getFilname().length() - 5, file1.getFilname().length())
+ "\"" + LINE_END);
dos.writeBytes("Content-Type: " + CONTENT_TYPE + " charset=" + CHARSET + LINE_END);
dos.writeBytes(LINE_END);
FileInputStream fStream = new FileInputStream(file1.getFile());
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
while ((length = fStream.read(buffer)) != -1) {
dos.write(buffer, 0, length);
}
dos.writeBytes(LINE_END);
fStream.close();
dos.writeBytes(PREFIX + BOUNDARY + LINE_END);
}
dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END);
dos.flush();
/**
* 获取响应码 200=成功
* 当响应成功,获取响应的流
*/
res = conn.getResponseCode();
if (res == 200) {
InputStream input = conn.getInputStream();
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = input.read()) != -1) {
sb1.append((char) ss);
}
result = sb1.toString();
Gson gson = new Gson();
imageSendDomain = gson.fromJson(result, ImageSendDomain.class);
System.out.println(result);
System.out.println(imageSendDomain.getErrCode());
return !imageSendDomain.getErrCode().equals("") ? imageSendDomain.getErrCode() : "-1";
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return RequestURL;
}
}
在数据全部拼接完以后,结尾是“--”也就是代码中的PREFIX
dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END);
文件之前需要有分割
dos.writeBytes(PREFIX + BOUNDARY + LINE_END);
如果说在添加一个文件后,直接加上PREFIX,很显然拼接结束,不会在后面拼接上其他文件,而是重新拼接。从而只能单文件。
ps:1、不要管上述代码中FormFile imageItem等是什么,知道文件路径就行了,file1.getFile是文件路径
2、如果说一次性上传的文件或图片过大的话,可能在上传的时候出现丢包或者中断,使用httpUrlConnection,内存过大也可能内存溢出等问题。
以上是我自己遇到的问题以及解决后的总结,说的有点简单,表达可能不是很合理,如果能理解,希望对有需要的朋友有所帮助吧,如果有问题,麻烦请指出,谢谢!!