首页 > 编程语言 >javaweb实现文件上传与下载功能

javaweb实现文件上传与下载功能

时间:2023-12-15 16:23:47浏览次数:38  
标签:文件 javaweb servlet filename import 上传 response 下载

本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下

一、文件上传

要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。

上传大多数情况是通过表单的形式提交给服务器,使用<input type="file">

使用<input type="file">标签需要注意以下两点:

1.必须设置name属性,不然浏览器不会发送上传文件的数据。

2.必须将method属性设置为post,ectype属性设置为“multipart/form-data”类型。

由于在Servlet直接读取上传数据,并且解析出相应文件数据是一项非常麻烦的工作。为了方便处理上传数据,Apache组织提供了一个开源组件Commons-FileUpload。该组件可以将“multipart/form-data”类型请求的各种表单域解析出来,并实现一个或多个文件上传,同时也可以限制上传文件的大小等内容。其性能十分优异,使用极其简单。

那么,下面就来看一个实例。

首先,创建一个Web项目,导入开源组件Commons-FileUpload的两个jar包,commons-fileupload-1.3.3.jar,commons-io-2.6.jar。

链接:下载

创建上传页面upload.html:

<!DOCTYPE html> <html> <head lang="en">  <meta charset="UTF-8">  <title>文件上传</title> </head> <body> <!--表单的enctype属性要设置为multipart/form-data--> <form action="UploadServlet" method="post" enctype="multipart/form-data">  <table width="600">  <tr>  <td>上传者</td>  <td><input type="text" name="name"/></td>  </tr>  <tr>  <td>上传文件</td>  <td><input type="file" name="myfile"/></td>  </tr>  <tr>  <!--设置单元格可横跨的列数。-->  <td colspan="2"><input type="submit" value="上传"/></td>  </tr>  </table>    </form> </body> </html>

创建Servlet:

package cn.itcast.fileupload; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import java.util.UUID; /**  * Created by lc on 2018/8/24.  */ @WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet") public class UploadSevlet extends HttpServlet {  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  doGet(request,response);  }     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  try{  response.setContentType("text/html;charset=utf-8"); // 创建DiskFileItemFactory工厂对象  DiskFileItemFactory factory=new DiskFileItemFactory(); // 设置文件缓存目录,如果该文件夹不存在则创建一个  File f=new File("S:\\TempFolder");  if (!f.exists()){  f.mkdirs();  }  factory.setRepository(f); // 创建ServletFileUpload对象  ServletFileUpload fileUpload=new ServletFileUpload(factory); // 设置字符编码  fileUpload.setHeaderEncoding("utf-8"); // 解析request,将form表单的各个字段封装为FileItem对象  List<FileItem> fileItems = fileUpload.parseRequest(request); // 获取字符流  PrintWriter writer=response.getWriter(); // 遍历List集合  for (FileItem fileItem:fileItems) { // 判断是否为普通字段  if (fileItem.isFormField()){ // 获取字段名称  String name = fileItem.getFieldName();  if(name.equals("name")){ // 如果字段值不为空  if (!fileItem.getString().equals("")){  String value=fileItem.getString("utf-8");  writer.print("上传者:"+value+"<br />");  }  }  }  else {  //获取上传的文件名  String filename=fileItem.getName(); // 处理上传文件  if(filename!=null&&filename!=""){  writer.print("上传的文件名称是:"+filename+"<br />"); // 保持文件名唯一  filename= UUID.randomUUID().toString()+"_"+filename;  String webpath="/upload/"; // 创建文件路径  String filepath=getServletContext().getRealPath(webpath+filename);  //创建File对象  File file=new File(filepath);  //创建文件夹  file.getParentFile().mkdirs();  //创建文件  file.createNewFile();  //获取上传文件流  InputStream in=fileItem.getInputStream(); // 使用 FileOutputStream打开服务器端的上传文件  FileOutputStream out=new FileOutputStream(file); // 流的对拷  byte[] bytes=new byte[1024];//每次读取一个字节  int len; // 开始读取上传文件的字节,并将其输出到服务器端的上传文件输出流中  while ((len=in.read(bytes))>0)  out.write(bytes,0,len);  in.close();  out.close();  fileItem.delete();  writer.print("文件上传成功!");  }  }        }  }catch (Exception e){  throw new RuntimeException(e);  }  } }

运行截图:

 

 

 

至此,文件上传功能就已经实现了。此时,进入项目发布目录,就可以看到上传的文件了,如下图:

 

二、文件下载

1.创建下载页面download.html

<!DOCTYPE html> <html> <head lang="en">  <meta charset="UTF-8">  <title>文件下载</title> </head> <body> <a href="/Download?filename=1.jpg" rel="external nofollow" >文件下载</a> </body> </html>

2.创建Servlet

package cn.itcast.fileupload; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /**  * Created by lc on 2018/8/24.  */ @WebServlet(name = "DownloadServlet",urlPatterns = "/Download") public class DownloadServlet extends HttpServlet {  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  doGet(request,response);  }     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  response.setContentType("text/html;charset=utf-8");  //获取文件名  String filename = request.getParameter("filename");  //文件所在的文件夹  String folder="/download/";  //通知浏览器以下载的方式打开  response.addHeader("Content-Type","application/octet-stream");  response.addHeader("Content-Disposition","attachment;filename="+filename);  //通过文件输入流读取文件  InputStream in=getServletContext().getResourceAsStream(folder+filename);  OutputStream out=response.getOutputStream();  byte[] bytes=new byte[1024];  int len=0;  while ((len=in.read(bytes))!=-1){  out.write(bytes,0,len);  }  } }

3.在项目发布目录,创建download文件夹,并且在文件夹里放置一个名为1.jpg的文件

如下图:

 

 

运行截图:

 

 

以上就是本文的全部内容,希望对大家的学习有所帮助

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/15/javaweb%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8e%e4%b8%8b%e8%bd%bd%e5%8a%9f%e8%83%bd/

欢迎入群一起讨论

 

 

标签:文件,javaweb,servlet,filename,import,上传,response,下载
From: https://www.cnblogs.com/songsu/p/17903601.html

相关文章

  • vue 前端自动打开文件地址进行下载
    最近在做异步导出的功能,导出的过程中前端另外启动一个查询导出进度的线程接口。如果导出完成后,把生成的文件上传到服务器,返回给前端一个文件的下载地址;前端自动打开这个地址进行跳转下载。有两种方式1.直接使用js自带的方式打开链接这种方式有一个问题,会被浏览器自动拦......
  • 如何上传项目到GitLab
    1.创建群组(可选) 2.创建项目3.可以选择给项目建立分支4.从GitLab拉取空项目放在本地编辑5.把要上传的项目文件复制到本地项目文件中,空白位置右键,选择GitCommit->分支,填写上传信息,选择上传文件,然后提交 ......
  • javascript怎么实现文件上传和下载功能
    在现代Web开发中,文件上传和下载是经常遇到的需求。JavaScript作为前端开发的语言之一,提供了许多强大的工具库和API来管理文件上传和下载的过程。本文将探讨如何使用JavaScript实现文件上传和下载的功能,首先介绍基于HTML5的FileAPI,然后使用jQuery和XMLHttpRequest......
  • 用html实现本地文件的上传
    实现本地文件的上传需要使用到HTML5中的FileAPI和FormData对象。以下是一个简单的实现示例:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>文件上传</title></head><body><formid="upload-form"><......
  • JavaWeb - Day08 - MySQL - 多表查询、事务、索引 - Mybatis - 入门
    01.MySQL-多表查询-概述数据准备#建议:创建新的数据库createdatabasedb04;usedb04;--部门表createtabletb_dept(idintunsignedprimarykeyauto_incrementcomment'主键ID',namevarchar(10)notnulluniquecomment'部门名称',......
  • c# 本地文件上传到服务器
    1、先把服务器上的路径设置成共享路径2、代码如下stringfileName="5002356611";//替换为你要查找的文件名stringaaa=@"E:\SAP图片";//替换为源文件夹的路径stringb=@"\\173.1.60.169\test";//替换成实际的网络路径(该路径必须是共享文件夹)var......
  • HTML5 文件上传下载的实例代码
    前言HTML5中提供的文件API在前端中有着丰富的应用,上传、下载、读取内容等在日常的交互中很常见。而且在各个浏览器的兼容也比较好,包括移动端,除了IE只支持IE10以上的版本。想要更好地掌握好操作文件的功能,先要熟悉每个API。FileList对象和file对象HTML中的input[type=......
  • backblaze b2通过cli下载大文件快照snapshots
    按照官方的常规方式,是先在cli下查看buckets  list-buckets找到b2snapshots的名称,然后通过download-file下载b2download-file--thread1b2://snapshots目录/备份文件名.注意下载大文件,最好是把现成设置成1-----------------------以上是常规方法,但是我下载了几......
  • 【TFTP】客户端上传文件
    1////客户端上传文件2#include<stdio.h>3#include<string.h>4#include<unistd.h>5#include<arpa/inet.h>6#include<netinet/in.h>7#include<sys/types.h>8#include<sys/stat.h>9#include<fcntl.h&g......
  • docker安装aira2 pro与ariang以及alist推送下载的配置
    Docker一键安装aira2-pro:dockerrun-d--namearia2--restartunless-stopped--log-optmax-size=1m-ePUID=$UID-ePGID=$GID-eUMASK_SET=022-eRPC_SECRET=12345678-eRPC_PORT=6800-eLISTEN_PORT=6888-p16800:6800-p16888:6888-p16888:6888/udp-v/mnt/c/......