上传:
1、设置表单的ENCTYPE='multipart/form-data'和method='post';
注意:这时候form表单中的其他参数在后台无法利用request.getParameter("paramName")获得,需要利用JS以参数的形式附加到提交URL后面。
2、利用InputStream in = request.getInputStream()以流的方式读取文件;
注意:剔除文件的头信息,占四行,可利用下面的方式:
for(int i = 0; i < 4; i++){
in.readLine();
}
3、写到输出流。
注意:利用缓冲区提高效率;调用out.flush()强制刷新缓冲区。
下载:
1、设置响应头信息:response.setContentType("application/octet-stream;charset=UTF-8");
2、设置附加文件信息:response.setHeader("Content-Disposition", "attachment; filename="
+ fileName);
注意:对于文件名fileName需要解决不同浏览器上对汉字编码的处理,这需要commons-codec库的支持,工具代码如下:
/** * 根据不同浏览器对文件名进行编码 * @param request 客户端请求 * @param fileName 文件名 * @return 编码后的文件名 */ public String encodeFileName(HttpServletRequest request, String fileName){ String agent = request.getHeader("USER-AGENT"); try{ if (null != agent && -1 != agent.indexOf("MSIE")) { return URLEncoder.encode(fileName, "UTF-8"); }else if (null != agent && -1 != agent.indexOf("Mozilla")) { return "=?UTF-8?B?"+ new String( Base64.encodeBase64( fileName.getBytes("UTF-8") ) ) + "?="; } else { return fileName; } }catch(UnsupportedEncodingException e){ return null; } }
3、利用输出流提供下载:OutStream out = response.getOutputStream()。
第三方上传组件:
commons-fileupload, cos, pell, jspsmartupload等。