2.12 基础文件上传

本文介绍了使用Java Servlet处理文件上传的步骤,包括通过HTML表单提交文件,使用Apache Commons FileUpload库解析请求,服务器端处理文件存储,以及通过AJAX异步上传。示例代码展示了如何接收和保存上传的文件,并返回文件路径。

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

2.12 基础文件上传

文件上传概要

上传文件
1.通过input type=file
2.通过 form 提交   以二进制方式传输数据 并可以传输文件数据  元素必须有name属性
       method = "post"  enctype="multipart/form-data"
3.服务器解析请求的数据
  使用工具 commons-fileupload-1.2.jar
          commons-io-1.3.2.jar
  解析form中的数据
  FileItem
      name=beauty.png,
      StoreLocation=D:\apache-tomcat-8.5.31\temp\upload_16b64998_1764f860805__7f72_00000001.tmp,
      size=2079bytes,
      isFormField=false,
      FieldName=ufile
4.在服务器创建一个文件 (同名文件 或 UUID重命名文件)
5.把解析出来的文件内容 写入到自己创建的文件中
配合ajax请求
6.返回文件的路径  (保存数据是时使用  生成预览)

在这里插入图片描述
在这里插入图片描述

1.前台 上传表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="text" name="uname">
      <input type="file" name="ufile">
      <br>
      <input type="submit">
    </form>
  </body>
</html>

2.后台接收上传文件(ajax)

package com.javasm.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
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.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/ajaxupload")
public class AjaxUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //运行的文件在服务器上的真实路径
        String bashPath = getServletContext().getRealPath("/");
        System.out.println(bashPath);
        //文件存储的路径
        String folderPath = "upload/";
        String returnPath = "";

        DiskFileItemFactory dff = new DiskFileItemFactory();
        ServletFileUpload sfu = new ServletFileUpload(dff);
        
        try {
            List<FileItem> filist = sfu.parseRequest(req);
            System.out.println(filist);
            for(FileItem fi:filist){
                //文件
                if(!fi.isFormField()){
                    //在服务器指定地址创建一个跟上传文件的同名文件
                    //再把临时文件内容复制入新创建的文件
                    //上传的文件名
                    String filePath = bashPath+folderPath+fi.getName();
                    /*
                    * 如果有很多用户往统一个目录存文件 可以通过UUID重命名文件 (截取到文件扩展名 跟uuid拼接起来)
                    * 避免用户上传文件名重复问题
                    * */
                    File newFile = new File(filePath);
                    //复制文件
                    fi.write(newFile);
                    returnPath = folderPath+fi.getName();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("{\"imgsrc\":\""+returnPath+"\"}");
        writer.flush();
        writer.close();
    }
}

2.后台接收上传文件(同步)

package com.javasm.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
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.File;
import java.io.IOException;
import java.util.List;

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String uname = req.getParameter("uname");
        String ufile = req.getParameter("ufile");
        System.out.println(uname);
        System.out.println(ufile);

        String bashPath = getServletContext().getRealPath("/");
        System.out.println(bashPath);
        String folderPath = "upload/";
        //判断请求方式是否是Multipart/formdata
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);
        System.out.println(isMultipart);
        DiskFileItemFactory dff = new DiskFileItemFactory();
        ServletFileUpload sfu = new ServletFileUpload(dff);

        try {
            List<FileItem> filist = sfu.parseRequest(req);
            System.out.println(filist);
            for(FileItem fi:filist){
                //文件
                if(!fi.isFormField()){
                    //在服务器指定地址创建一个跟上传文件的同名文件
                    //再把临时文件内容复制入新创建的文件
                    //上传的文件名
                    String filePath = bashPath+folderPath+fi.getName();
                    File newFile = new File(filePath);
                    //复制文件
                    fi.write(newFile);
                }else{
                //普通表单数据
                    String fieldName = fi.getFieldName();
                    String fieldValue = fi.getString();
                    String newVal =new String(fieldValue.getBytes("iso-8859-1"),"utf-8");
                    System.out.println(fieldName+newVal);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值