如何用java代码实现上传文件和下载文件

发布时间 2023-09-27 09:42:45作者: Xproer-松鼠

如何用java代码实现上传文件:
首先创建一个项目创建index.jsp页面如下

只要是上传文件就要使用form标签的enctype属性:

<!--只要是涉及到上传文件 enctype="multipart/form-data" -->
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="user">
<input type="file" name="fName">
<input type="submit" value="上传">
</form>

之后创建UploadServlet,servlet当提交上传的文件之后进行处理:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//上传文件
//一般都会保存到项目里面去
String pathString=this.getServletContext().getRealPath("/WEB-INF/Upload");
//判断路径是否存在
File file=new File(pathString);
if (!file.exists()&& !file.isDirectory()) {
//如果目录不存则创建
System.out.println("创建路径");
file.mkdir();
}
//接下来就是servlet控制台的区别
//1、创建文件上传的工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//2、创建文件解析的工具
ServletFileUpload upload=new ServletFileUpload(factory);
//解决中文乱码的问题
upload.setHeaderEncoding("UTF-8");//设置好请求头部的字符编码
//3、判断提交上传的数据是否是上传表单的数据
//通过jar判断请求的request对象是否为上传表单
if (!ServletFileUpload.isMultipartContent(request)) {
return;//如果不是则直接return 不往下面走
}
//4、使用文件工具对象, 去解析表单 使用工具解析我们上传的所有数据
try {

List<FileItem> list= upload.parseRequest(request);
//把整个表单的数据解析, 然后封装成list的集合

for (FileItem fileItem : list) {
//要区分是普通的文本框还是文件筐
if (fileItem.isFormField()) {//普通的
String nameString=fileItem.getFieldName();//拿到属性名
String valueString=fileItem.getString("UTF-8");
System.out.println(nameString+valueString);

}else{//文件的
String fileNameString=fileItem.getName();
System.out.println(fileNameString);

//5、创建输入流和输出流
InputStream inputStream=fileItem.getInputStream();
FileOutputStream outputStream=new FileOutputStream(pathString+"\\"+fileNameString);

byte[] bytes=new byte[1024];
int i=0;
//循环将输入到数组里面如果大于0说明还有数据
while ((i=inputStream.read(bytes))>0) {

outputStream.write(bytes,0,i);
}
//关闭资源
inputStream.close();
outputStream.close();
}
}
} catch (FileUploadException e) {

e.printStackTrace();
}
}

 这样就完成了文件的上传,接着直接到你的Tomcat项目找到你的webapps—>你的项目名字…

 就可以看到你上传的文件了。
接下来是下载:
首先我们需要把指定的文件读取出来在页面中显示:创建一个servlet,DownLoadListServlet:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//我们要把所有下载的文件加载到页面里面
String downPath=this.getServletContext().getRealPath("/WEB-INF/upload");

//System.out.println("完整路径是:"+downPath);
//获取当前下载列表的路径
//创建一个存储文件名的集合
Map<String, String> fileList=new HashMap<String, String>();
File file=new File(downPath);//该目录可以是文件也可以是目录
list(file, fileList);
request.getSession().setAttribute("fileList",fileList);
response.sendRedirect("download.jsp");
}
/**
* 通过该方法吧所有的文件插入到集合里面
* @param file
* @param map
*/
public void list(File file,Map<String, String> map){
//判断我们传入进来的file是一个文件还是一个目录
if (file.isFile()) {//这里是一个文件是true
map.put(file.getName(), file.getName());
}else {//不是文件而是一个目录
File[] files=file.listFiles();//把所有的文件拿到手
for (File f : files) {
list(f,map);//使用递归除非是文件才插入
}
}
}

当我们获取到文件之后跳转到download.jsp显示:使用的是EL和标签库输出数据

<!-- 遍历一下map集合 -->
<c:forEach var="me" items="${fileList}">
<c:url value="DownloadFileServlet" var="downurl">
<c:param name="fileName" value="${me.key}"></c:param>
</c:url>
${me.value}<a href="${downurl}">下载</a>
</c:forEach>

点击下载的时候跳转到DownloadFileServlet,servlet进行处理:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8");
String fileNameString=request.getParameter("fileName");
//用户选择下载的文件名拿到手

//因为我们的路径保存在upload
String path=this.getServletContext().getRealPath("/WEB-INF/upload");
//要在当前的路径里面找到文件夹的路径
File file=new File(path+"\\"+fileNameString);

//确保我们下载的文件真实存在的
if (!file.exists()) {
//如果不存在这不用下载
return;
}
response.setHeader("content-disposition", "attachment;filename="
+URLEncoder.encode(fileNameString,"UTF-8"));
//设置响应头控制浏览器下载该文件
InputStream inputStream=new FileInputStream(file);
//输入流
OutputStream out=response.getOutputStream();

//创建缓冲区
byte [] bytes=new byte[1024];
int i=0;
while ((i=inputStream.read(bytes))>0) {
out.write(bytes,0,i);
}
inputStream.close();
out.close();
}

 当我们点击下载的时候就成功了!

 

参考文章:http://blog.ncmem.com/wordpress/2023/09/27/%e5%a6%82%e4%bd%95%e7%94%a8java%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e5%92%8c%e4%b8%8b%e8%bd%bd%e6%96%87%e4%bb%b6/

欢迎入群一起讨论