今天用公司自己封装的框架开发时,突然需要向服务器上传文件,通过查找资料,发现两种方式可以相对方便的接收文件。
方法一:request.getPart("web端的文件标签名");
getPart()是servlet3.0新增的方法,而且需要tomcat7.0以上的版本,web.xml的version在3.0以上,使用getPart()需要注意的是要对servlet使用@MultipartConfig()注解,否则得到结果是空的。
File filePath = new File(realPath);
if(!filePath.exists())
filePath.mkdirs();
Part part = req.getPart("upload");
InputStream in = part.getInputStream();
OutputStream out = new FileOutputStream(realPath + fileName);
byte[] buffer = new byte[1024];
int length = -1;
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
in.close();
out.close();
方法二:先读取输入流,在取文件在流的位置,在写入文件
读取输入流
/**
* 读取流
* @param request
* @return
* @throws IOException
*/
private byte[] readBody(HttpServletRequest request) throws IOException {
//获取请求文本字节长度
int formDataLength = request.getContentLength();
//取得ServletInputStream输入流对象
DataInputStream dataStream = new DataInputStream(request.getInputStream());
byte body[] = new byte[formDataLength];
int totalBytes = 0;
while (totalBytes < formDataLength) {
int bytes = dataStream.read(body, totalBytes, formDataLength);
totalBytes += bytes;
}
return body;
}
获取文件内容在流数据的位置
/**
* 流中文件的位置
* @author lenovo
*
*/
class Position {
int begin;
int end;
public Position(int begin, int end) {
this.begin = begin;
this.end = end;
}
}
/**
* 获取文件流的位置
* @param request
* @param textBody
* @return
* @throws IOException
*/
private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {
//取得文件区段边界信息
String contentType = request.getContentType();
String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length());
//取得实际上传文件的气势与结束位置
int pos = textBody.indexOf("filename=\"");
pos = textBody.indexOf("\n", pos) + 1;
pos = textBody.indexOf("\n", pos) + 1;
pos = textBody.indexOf("\n", pos) + 1;
int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4;
int begin = ((textBody.substring(0, pos)).getBytes("ISO-8859-1")).length;
int end = ((textBody.substring(0, boundaryLoc)).getBytes("ISO-8859-1")).length;
return new Position(begin, end);
}
写入文件
/**
* 流写入文件
* @param fileName
* @param body
* @param p
* @throws IOException
*/
private void writeTo(String fileName, byte[] body, Position p) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
fileOutputStream.write(body, p.begin, (p.end - p.begin));
fileOutputStream.flush();
fileOutputStream.close();
}
以上就是所有的核心代码,之后可以继续深入研究,重新封装。