java实现文件上传和下载
本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下
文件的上传
upload:文件上传
客户端通过表单的文件域file 把客户端的文件 上传保存到服务器的硬盘上
页面
首先对上传的表单有以下要求:
- 必须有文件域:input type=file
- 表单提交方式:method=post
- 表单的 enctype=multipart/form-data
<
form
method
=
"post"
action
=
"/user/regist"
enctype
=
"multipart/form-data"
>
<
table
style
=
"border: chartreuse;solid:2px"
>
<
tr
>
<
th
>用户名</
th
>
<
td
><
input
type
=
"text"
name
=
"username"
></
td
>
</
tr
>
<
tr
>
<
th
>密码</
th
>
<
td
><
input
type
=
"password"
name
=
"password"
></
td
>
</
tr
>
<
tr
>
<
th
>用户头像</
th
>
<
td
><
input
type
=
"file"
name
=
"photo"
> </
td
>
</
tr
>
<
tr
>
<
td
colspan
=
"2"
><
input
type
=
"submit"
value
=
"提交"
></
td
>
</
tr
>
</
table
>
</
form
>
Servlet
1)首先要导入以下两个jar包,通过commons-fileupload实现文件上传
2)创建一个工厂对象DiskFileItemFactory,在创建一个多部件表单解析器ServletFileUpload,构造方法传入工厂对象
3)解析器解析请求对象,获得一个list集合,其中list集合存储的是一个一个的fileItem对象,一个fileItem对应一个组件,也就是一个<input>
4) 遍历集合用isFormField()方法判断是否为普通组件,然后着重处理文件域组件
5)获取文件名,并用getRealPath方法获取服务器上传文件所在路径,创建新文件夹
6)获取输入流和创建输出流,进行文件的读写
@WebServlet
(value =
"/user/regist"
)
public
class
UploadServlet
extends
HttpServlet {
protected
void
doPost(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException {
//创建一个工厂对象
DiskFileItemFactory factory =
new
DiskFileItemFactory();
//创建一个多部件解析器对象
ServletFileUpload fileUpload =
new
ServletFileUpload(factory);
User user =
new
User();
FileOutputStream out=
null
;
try
{
//用解析器对象解析请求,返回一个FileItem类型的集合
List<FileItem> list = fileUpload.parseRequest(req);
for
(FileItem fileItem : list) {
/**
* fileItem.getFieldName());:::获取组件的name值
* fileItem.getName());::::获取文件域的文件名
* fileItem.getSize());::::获取数据的字节个数
* fileItem.getString());::::获取数据的字符串
* fileItem.isFormField());:::判断是否为普通组件
*/
//判断部件是否为普通组件
if
(fileItem.isFormField()) {
//普通组件
//获取组件名字也就是name的值
String fieldName = fileItem.getFieldName();
//获取组件的值也就是value的值
String value = fileItem.getString(
"utf-8"
);
if
(
"username"
.equals(fieldName)) {
//设置实体类的属性
user.setUsername(value);
}
else
if
(
"password"
.equals(fieldName)) {
user.setPassword(value);
}
}
else
{
// 文件域
//获取文件名
String fielName = fileItem.getName();
//输入流来读数据
InputStream in = fileItem.getInputStream();
//设置文件写出的路径,并用随机码来保证图片可以重复
String path=req.getServletContext().getRealPath(
"/imgs/"
+ UUID.randomUUID()+fielName);
System.out.println(
"文件路径为:"
+path);
File file =
new
File(path);
out =
new
FileOutputStream(file);
//利用commons-io-1.4.jar的IOUtils的copy方法直接实现文件的复制
IOUtils.copy(in,out);
user.setPhoto(file.getName());
}
}
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
if
(out!=
null
){
out.close();
}
}
req.getSession().setAttribute(
"user"
,user);
req.getRequestDispatcher(
"/sucess.jsp"
).forward(req,resp);
}
}
文件的下载
页面
只需一个超链接,传需要下载的文件名,或者直接输入路径在浏览器
例: <a href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>
Servlet
1)接收参数,获取文件名
2)获取imgs的路径,也就是存储文件的文件夹的路径,然后创建文件,传入该路径和文件名
3)创建输入流读取文件
4)设置响应头,首先根据文件名字获取文件的大类型,设置响应头Content-Type指定响应的类型;设置响应头Content-Disposition,指定文件以附件形式保存到本地磁盘
5)用响应获取输出流,读出文件到客户端
@WebServlet
(
"/user/download"
)
public
class
DownloadServlet
extends
HttpServlet {
protected
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
request.setCharacterEncoding(
"UTF-8"
);
//获取要下载的文件名
String fileName = request.getParameter(
"fileName"
);
System.out.println(fileName);
//获取服务器中存储图片的文件夹的路径
String path1 = request.getServletContext().getRealPath(
"/imgs"
);
String path=path1+
"/"
+fileName;
File file =
new
File(path);
//创建输入流读文件
FileInputStream in =
new
FileInputStream(file);
//通过文件名字获取文件的大类型
String type = request.getServletContext().getMimeType(fileName);
//设置响应头ContentType指定响应内容的类型
response.setHeader(
"Content-type"
,type);
//设置响应头Content-Disposition 指定以附件形式保存响应的信息
response.setHeader(
"Content-Disposition"
,
"attachment;filename="
+(URLEncoder.encode(fileName,
"utf-8"
)));
ServletOutputStream out = response.getOutputStream();
//实现文件的读写
IOUtils.copy(in,out);
if
(in!=
null
){
in.close();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助
参考文章:http://blog.ncmem.com/wordpress/2023/12/12/java%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd/
欢迎入群一起讨论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-12-12 java之大文件分段上传、断点续传
2019-12-12 jsp之大文件分段上传、断点续传
2019-12-12 asp.net之大文件分段上传、断点续传
2019-12-12 javascript之大文件分段上传、断点续传
2019-12-12 js大文件分块上传断点续传demo
2019-12-12 web大文件分块上传断点续传demo
2019-12-12 php大文件分块上传断点续传demo