JavaWeb基础知识总结. (63)

隆重介绍FileItem类,它才是我们最终要的结果。一个FileItem对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用FileItem类的isFormField()方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。

l String getName():获取文件字段的文件名称;

l String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;

l String getFieldName():获取字段名称,例如:<input type=”text” name=”username”/>,返回的是username;

l String getContentType():获取上传的文件的类型,例如:text/plain。

l int getSize():获取上传文件的大小;

l boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;

l InputStream getInputStream():获取上传文件对应的输入流;

l void write(File):把上传的文件保存到指定文件中。

3 简单上传示例

写一个简单的上传示例:

l 表单包含一个用户名字段,以及一个文件字段;

l Servlet保存上传的文件到uploads目录,显示用户名,文件名,文件大小,文件类型。

第一步:

完成index.jsp,只需要一个表单。注意表单必须是post的,而且enctype必须是mulitpart/form-data的。

<form action=http://www.likecs.com/"${pageContext.request.contextPath }/FileUploadServlet" method=http://www.likecs.com/"post"enctype=http://www.likecs.com/"multipart/form-data">

用户名:<input type=http://www.likecs.com/"text" name=http://www.likecs.com/"username"/><br/>

文件1:<input type=http://www.likecs.com/"file" name=http://www.likecs.com/"file1"/><br/>

<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"提交"/>

</form>

 

第二步:

完成FileUploadServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 因为要使用response打印,所以设置其编码

response.setContentType("text/html;charset=utf-8");

// 创建工厂

DiskFileItemFactory dfif = new DiskFileItemFactory();

// 使用工厂创建解析器对象

ServletFileUpload fileUpload = new ServletFileUpload(dfif);

try {

// 使用解析器对象解析request,得到FileItem列表

List<FileItem> list = fileUpload.parseRequest(request);

// 遍历所有表单项

for(FileItem fileItem : list) {

// 如果当前表单项为普通表单项

if(fileItem.isFormField()) {

// 获取当前表单项的字段名称

String fieldName = fileItem.getFieldName();

// 如果当前表单项的字段名为username

if(fieldName.equals("username")) {

// 打印当前表单项的内容,即用户在username表单项中输入的内容

response.getWriter().print("用户名:" + fileItem.getString() + "<br/>");

}

else {//如果当前表单项不是普通表单项,说明就是文件字段

String name = fileItem.getName();//获取上传文件的名称

// 如果上传的文件名称为空,即没有指定上传文件

if(name == null || name.isEmpty()) {

continue;

}

// 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在

String savepath = this.getServletContext().getRealPath("/uploads");

// 通过uploads目录和文件名称来创建File对象

File file = new File(savepath, name);

// 把上传文件保存到指定位置

fileItem.write(file);

// 打印上传文件的名称

response.getWriter().print("上传文件名:" + name + "<br/>");

// 打印上传文件的大小

response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>");

// 打印上传文件的类型

response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>");

}

}

catch (Exception e) {

throw new ServletException(e);

}

}

 
文件上传之细节 1 把上传的文件放到WEB-INF目录下

如果没有把用户上传的文件存放到WEB-INF目录下,那么用户就可以通过浏览器直接访问上传的文件,这是非常危险的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html