最后
学习视频:
大厂面试真题:
if (newFileName == null || newFileName.trim().equals(“”)) {
newFileName = uploadFile.getName();
}
StringBuilder sb = new StringBuilder();
/**
- 普通的表单数据
*/
for (String key : params.keySet()) {
sb.append(“–” + BOUNDARY + “\r\n”);
sb.append(“Content-Disposition: form-data; name=”" + key + “”"
- “\r\n”);
sb.append(“\r\n”);
sb.append(params.get(key) + “\r\n”);
}
/**
- 上传文件的头
*/
sb.append(“–” + BOUNDARY + “\r\n”);
sb.append(“Content-Disposition: form-data; name=”" + fileFormName
- “”; filename=“” + newFileName + “”" + “\r\n”);
sb.append(“Content-Type: image/jpeg” + “\r\n”);// 如果服务器端有文件类型的校验,必须明确指定ContentType
sb.append(“\r\n”);
byte[] headerInfo = sb.toString().getBytes(“UTF-8”);
byte[] endInfo = (“\r\n–” + BOUNDARY + “–\r\n”).getBytes(“UTF-8”);
System.out.println(sb.toString());
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“Content-Type”,
“multipart/form-data; boundary=” + BOUNDARY);
conn.setRequestProperty(“Content-Length”, String
.valueOf(headerInfo.length + uploadFile.length()
- endInfo.length));
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
InputStream in = new FileInputStream(uploadFile);
out.write(headerInfo);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1)
out.write(buf, 0, len);
out.write(endInfo);
in.close();
out.close();
if (conn.getResponseCode() == 200) {
System.out.println(“上传成功”);
}
}
我详细解释一下,首先我拼接了需要发送的数据,其实就是咱们在图三中看到的数据,然后使用HttpUrlConnetion设置了一系列属性其实就是在设置图二中看到的请求头信息。
于是,我们完成了请求头的设置,以及需要上传数据的拼接,所以我们完成了浏览器的工作,自然就实现文件上传了。
2、使用Socket实现文件上传,参数基本一致,使用HttpUrlConnection上传有一个很致命的问题就是,当上传文件很大时,会发生内存溢出,手机分配给我们app的内存更小,所以就更需要解决这个问题,于是我们可以使用Socket模拟POST进行HTTP文件上传。
/**
-
@param params
-
传递的普通参数
-
@param uploadFile
-
需要上传的文件名
-
@param fileFormName
-
需要上传文件表单中的名字
-
@param newFileName
-
上传的文件名称,不填写将为uploadFile的名称
-
@param urlStr
-
上传的服务器的路径
-
@throws IOException
*/
public void uploadFromBySocket(Map<String, String> params,
String fileFormName, File uploadFile, String newFileName,
String urlStr) throws IOException {
if (newFileName == null || newFileName.trim().equals(“”)) {
newFileName = uploadFile.getName();
}
StringBuilder sb = new StringBuilder();
/**
- 普通的表单数据
*/
if (params != null)
for (String key : params.keySet()) {
sb.append(“–” + BOUNDARY + “\r\n”);
sb.append(“Content-Disposition: form-data; name=”" + key
- “”" + “\r\n”);
sb.append(“\r\n”);
sb.append(params.get(key) + “\r\n”);
} else{ab.append(“\r\n”);}
/**
- 上传文件的头
*/
sb.append(“–” + BOUNDARY + “\r\n”);
sb.append(“Content-Disposition: form-data; name=”" + fileFormName
- “”; filename=“” + newFileName + “”" + “\r\n”);
sb.append(“Content-Type: image/jpeg” + “\r\n”);// 如果服务器端有文件类型的校验,必须明确指定ContentType
sb.append(“\r\n”);
byte[] headerInfo = sb.toString().getBytes(“UTF-8”);
byte[] endInfo = (“\r\n–” + BOUNDARY + “–\r\n”).getBytes(“UTF-8”);
System.out.println(sb.toString());
URL url = new URL(urlStr);
Socket socket = new Socket(url.getHost(), url.getPort());
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os, true, “UTF-8”);
// 写出请求头
ps.println(“POST " + urlStr + " HTTP/1.1”);
ps.println(“Content-Type: multipart/form-data; boundary=” + BOUNDARY);
ps.println("Content-Length: "
-
String.valueOf(headerInfo.length + uploadFile.length()
-
endInfo.length));
ps.println(“Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”);
InputStream in = new FileInputStream(uploadFile);
// 写出数据
os.write(headerInfo);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1)
os.write(buf, 0, len);
os.write(endInfo);
最后
很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。
我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。
不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~