2024年最全从原理角度解析Android (Java) http 文件上传,高级java工程师面试技术

最后

学习视频:

大厂面试真题:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值