java实现网页的下载和上传

本文详细介绍了使用Java Web实现文件上传和下载的具体步骤,包括如何配置项目,导入所需jar包,以及实现上传下载功能的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文讲的是网页中如何跟用户进行资源交互。想要玩上传和下载就必须导入两个jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.jar。
下载jar包没什么好说的,自己去百度搜索下载,下面步入正题:(直接拿实际项目举例子)
1.创建一个jsp

<form action="UploadServlet" method="post" enctype="multipart/form-data">
      学号:<input type="text" name="sno"/><br/>
      姓名:<input type="text" name="sname"/><br/>
      上传照片:<input type="file" name="spicture"/>
      <br/>
      <input type="submit"/>                  
</form>
<a href="DownloadServlet?filename=图片.png">下载图片</a>

注意上面的表单的提交方式必须得是post方法,且后面必须跟上enctype=“multipart/form-data”。

实现下载功能的代码

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.codec.binary.Base64;
public class DownloadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 public DownloadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setCharacterEncoding("utf-8");
  //获取需要下载的文件名
  String fileName = request.getParameter("filename");//form 、a、 href 、server?a=b
  //下载文件 :需要设置 两个消息头
  response.addHeader("content-Type","application/ortet-stream");//MIME类型:二进制文件(任意文件)
  String agent = request.getHeader("User-Agent");
  if(agent.toLowerCase().indexOf("firefox") != -1) {
   //火狐 给文件名加  前缀:=?UTF-8?B?  Base64.encodeBase64  String构造方法   后缀:?=
   response.addHeader("content-Disposition","attachment;filename==?UTF-8?B?"+ new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))+"?=");
  }else {
     //后面的URLEcoder.encode()是针对edge浏览器  的防止文件名乱码的方法
     response.addHeader("content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));//fileName包含了文件后缀:abc .txt
  }
  //Servlet通过文件的地址 将文件转为输入流  读到servlet中
  InputStream in = getServletContext().getResourceAsStream("/res/"+fileName);
  
  //通过输出流 将 刚才已经转为输入流的文件 输出给用户
  ServletOutputStream out = response.getOutputStream();
  byte[] bs = new byte[10];
  int len = -1;
     while( (len=in.read(bs)) != -1) {
      out.write(bs,0,len);
     }
     out.close();
  in.close();
  
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
 }
 }

实现上传操作的代码

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setCharacterEncoding("utf-8");
  response.setCharacterEncoding("utf-8");
  response.setContentType("text/html;charset=UTF-8");
  //上传
     boolean isMultipart = ServletFileUpload.isMultipartContent(request);
     if(isMultipart) {//判断前台的form是否有mutipart属性
      //FileItemFactory factory =new DiskFileItemFactory();
      DiskFileItemFactory factory =new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      //////限制操作一定要在解析之前完成
      //设置上传文件时 用到的临时文件 的大小   用DisFileItemFactory类来实现
      factory.setSizeThreshold(10240);//设置临时的缓冲文件大小为10kb
      factory.setRepository(new File("C:\\Users\\Lenovo\\Desktop\\temp"));//设置临时文件的目录位置
      //控制单个上传文件的大小  20kb 用ServletFileUpload类实现
      upload.setSizeMax(20480);//单位是字节b
      //通过parseRequest解析form中的所有请求字段,并保存到items集合中(即前台传递的sno,snaem,spicture此时就保存在了items中)  
    try {
     List<FileItem> items = upload.parseRequest(request);
     //遍历items中的数据(sno sname spicture)
        Iterator<FileItem> iter =items.iterator();
        while(iter.hasNext()) {
         FileItem item = iter.next();
         String itemName = item.getFieldName();
         int sno = -1;
         String sname = null;
         //判断前台字段  是普通form表单字段,还是文件字段 
       if(item.isFormField()) {
         if(itemName.equals("sno")) {//根据name属性 判断items是sno sname 还是spicture?
          sno = Integer.parseInt(item.getString("UTF-8"));
         }else if(itemName.equals("sname")) {
          sname = item.getString("UTF-8") ;
         }else {
          System.out.println("其他字段.....");
         }
        }else {//spicture
         //文件名 getFieldName是获取 普通表单字段的Name值
         //getName()是获取文件名
         String fileName = item.getName();
         String exe = fileName.substring(fileName.indexOf(".")+1);
         if(!(exe.equals("png")||exe.equals("gif")||exe.equals("jpg"))) {
          System.out.println("图片上传有误!!!格式只能是png,gif,jpg");
          return;
         }//控制上传文件类型
         //获取文件内容 并上传
         //定义文件路径:指定上传位置(服务器路径)
         //获取服务器路径
         //String path = request.getSession().getServletContext().getRealPath("upload");
         String path = "C:\\Users\\Lenovo\\Desktop\\java文件上传路径";
         File file = new File(path,fileName);
       item.write(file);
       System.out.println(fileName+"上传成功!!");
       return;     
        }
       }
    } catch(FileUploadBase.SizeLimitExceededException e) {//FileUploadBase.SizeLimitExceededException是FileUploadException的子类      
     System.out.println("上传文件大小超过限制,最大20kb!!!!");
    }catch (FileUploadException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }catch(Exception e) {
     e.printStackTrace();
    } 
     }
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  doGet(request, response);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘歌唱家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值