javaweb文件上传
文件上传
在项目中,文件的上传是常见的功能。很多程序或者软件中都经常使用到文件的上传。
- 邮箱中有附件的上传;
- 图片上传。
当用户在前端页面点击文件上传后,用户上传的文件数据提交给服务器端,实现保存。
1._上传对表单的限制
method="post"
;enctype="multipart/form-data"
;- 表单中需要添加文件表单项:
<input type="file" name="xxx" />
<form action="xxx" method="post" enctype="multipart/form-data">
用户名;<input type="text" name="username"/><br/>
照 片:<input type="file" name="photo"/><br/>
<input type="submit" value="上传"/>
</form>
2._上传对Servlet的限制
request.getParameter("xxx")
这个方法在表单为enctype="multipart/form-data"
时,它作废了,它永远都返回null
。
3._实现文件上传如何实现文件上传
3.1._相关Jar包
它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可。
3.2._实例
创建工厂:
DiskFileItemFactory factory = new DiskFileItemFactory()
;创建解析器:
ServletFileUpload sfu = new ServletFileUpload(factory)
;使用解析器来解析
request
,得到FileItem
集合:
List<FileItem> fileItemList = sfu.parseRequest(request)
,
FileItem
中常用方法:
boolean isFormField()
:是否为普通表单项!返回true为普通表单项,如果为false即文件表单项String getFieldName()
:返回当前表单项的名称;String getString(String charset)
:返回表单项的值;String getName()
:返回上传的文件名称;long getSize()
:返回上传文件的字节数;InputStream getInputStream()
:返回上传文件对应的输入流;void write(File destFile)
:把上传的文件内容保存到指定的文件中。
3.3._具体步骤
//创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建解析器
ServletFileUpload sfu = new ServletFileUpload(factory);
//文件名或普通表单项乱码 两个方案二选一
request.setCharacterEncoding("utf-8");
//sfu.setHeaderEncoding("utf-8");
try {
//使用解析器来解析request,得到FileItem集合
List<FileItem> list = sfu.parseRequest(request);
for (FileItem item : list) {
if(item.isFormField()) {
String fieldName = item.getFieldName();
String value = item.getString("utf-8");
System.out.println(fieldName + ":" + value);
} else {
String fileName = item.getName();
long size = item.getSize();
System.out.println("文件名:" + fileName);
System.out.println("文件大小" + size);
ServletContext servletContext = this.getServletConfig().getServletContext();
String realPath = servletContext.getRealPath("/img");
// 同名文件上传问题
item.write(new File(realPath +
"/" +
UUID.randomUUID().toString().replace("-", "") +
"_" +
fileName));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
```
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库