Servlet 文件上传
1. 使用InputStream
通过request.getInputStream()获取文件输入流,
上传解析代码如下
publicvoid doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
char[] charBuffer = newchar[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
String content = stringBuilder.toString();
}
但是这种方法上传的文件与文件之间用分隔符隔开,导致解析文件内容比较困难。
获取上传文件,打印文件内容如下:
-----------------------------7df13128408c8
Content-Disposition: form-data; name="file2"; filename="C:\Users\mapengbo\Desktop\android-statistic.txt"
Content-Type: text/plain
Hello World
-----------------------------7df13128408c8
Content-Disposition: form-data; name="file3"; filename="C:\Users\mapengbo\Desktop\android-statistic.txt"
Content-Type: text/plain
Hello every body
-----------------------------7df13128408c8—
其中“-----------------------------7df13128408c8”就是文件的分隔符,
分隔符每次上传都不一样,可通过下面的代码输出这个字段值:
System.out.println(request.getHeader("Content-type"));
输出的内容如下:
multipart/form-data; boundary=---------------------------106712230227687
接下来的工作就是解析这些文件流,获取文件内容。
网上看到的解析的代码:http://blog.csdn.net/ybygjy/article/details/5869158
2. 使用开源组件(Commons-fileupload)
首先项目中要引入commons-fileupload-1.2.jar
代码如下
publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
try {
if(ServletFileUpload.isMultipartContent(request)) {
// 创建该对象
DiskFileItemFactory dff=new DiskFileItemFactory();
// 指定在内存中缓存数据大小,单位为byte
dff.setSizeThreshold(1024000);
// 创建该对象
ServletFileUpload sfu=new ServletFileUpload(dff);
// 指定单个上传文件的最大尺寸
sfu.setFileSizeMax(5000000);
// 指定一次上传多个文件的总尺寸
sfu.setSizeMax(10000000);
// 解析request 请求,并返回FileItemIterator集合
FileItemIterator fii=sfu.getItemIterator(request);
StringBuffer stringBuffer=new StringBuffer();
while(fii.hasNext()) {
// 从集合中获得一个文件流
FileItemStream fis=fii.next();
// 过滤掉表单中非文件
if(!fis.isFormField() && fis.getName().length() > 0) {
BufferedInputStream in=new BufferedInputStream(fis.openStream());// 获得文件输入流
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(in,"UTF-8"));
String lineTxt=null;
while((lineTxt=bufferedReader.readLine()) != null) {
System.out.println(lineTxt);
stringBuffer.append(lineTxt+",");
}
}
}
response.getWriter().println(stringBuffer.toString());
}
} catch(Exception e) {
e.printStackTrace();
}
}
用该工具包的好处是不用自己解析文件内容。