首先,简单介绍Java的文件上传流程。Java实现文件上传分为客户端和服务端两个部分。客户端将要上传的文件通过HTTP POST请求的方式发送给服务端,服务端再进行解析并保存文件。
- 客户端上传文件
客户端上传文件需要通过HttpURLConnection发送POST请求,代码示例:
URL url = new URL(uploadUrl);// 上传的服务器地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Charset", "UTF-8");
String boundary = "******"; // 分隔符,可以自定义一个字符串
String endline = "\r\n";
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); // 设置请求头
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes("--" + boundary + endline);
outputStream.writeBytes("Content-Disposition: form-data; name=\"" + FORM_NAME + "\"; filename=\"" + file.getName() + "\"" + endline);
outputStream.writeBytes(endline);
FileInputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
outputStream.writeBytes(endline);
inputStream.close();
outputStream.writeBytes("--" + boundary + "--" + endline);
outputStream.flush();
outputStream.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 上传成功
} else {
// 上传失败
}
具体来说,客户端创建一个URL对象,并通过url.openConnection()方法打开一个HttpURLConnection连接对象。设置连接超时时间,setDoInput()和setDoOutput()方法表示可以向服务器上传数据并接收数据。
将请求头设置成multipart/form-data方式,Content-Type中设置boundary分隔符,这里可以自定义字符串。根据Http协议,在每个参数之间添加--boundary和\r\n标识分隔符开始和结束,文件参数的Content-Disposition的form-data参数需要指定上传表单的name,filename是本地文件名。
在创建DataOutputStream对象时,需要将文件数据写入输出流中。使用FileInputStream读取本地文件,使用DataOutputStream将文件写入输出流。
发送完毕后,调用getResponseCode()方法获取服务端响应码,HTTP_OK表示上传成功,否则上传失败。
- 服务端接收文件
在服务端接收文件上传请求时,需要使用multipart/form-data方式进行解析。根据不同的Web框架实现,流程可能有所不同,在这里介绍一个SpringMVC框架的实现方式。示例代码如下:
@RequestMapping(value = "upload", method = RequestMethod.POST)
@ResponseBody
public String upload(HttpServletRequest request) throws IOException {
String filePath = "/upload/";
String fileName = "";
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Iterator<String> iter = multipartRequest.getFileNames();
while (iter.hasNext()) {
MultipartFile multipartFile = multipartRequest.getFile(iter.next());
if (multipartFile != null) {
fileName = multipartFile.getOriginalFilename();
saveFile(filePath, fileName, multipartFile);
}
}
return "上传成功";
}
private void saveFile(String path, String fileName, MultipartFile file) throws IOException {
String filePath = path + fileName;
File destFile = new File(filePath);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
file.transferTo(destFile);
}
对于SpringMVC框架来说,客户端上传文件后,首先经过DispatcherServlet进行URL映射,根据@RequestMapping的配置将上传请求分发给控制器处理。
SpringMVC中提供了MultipartHttpServletRequest类和MultipartFile接口方便解析文件内容。通过getFileNames()方法获取上传文件的name,循环迭代multipartRequest.getFile()可以获取到每个上传的文件,使用getOriginalFilename()方法可以获取文件名,通过transferTo()方法将文件写入磁盘。
在saveFile()方法中,先创建文件夹(如果不存在),最后将文件转移至指定路径。
总结:客户端向服务器上传文件需要发送POST请求,设置multipart/form-data格式的请求头,以及分隔符。服务端从文件上传中获取到的数据,需要使用MultipartFile和MultipartHttpServletRequest类对POST请求进行解析,并保存上传的文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java模拟客户端向服务器上传文件 - Python技术站