聊聊在Servlet中怎么上传文件

首先对Servlet上传文件的简单理解

此前,Servlet本身没有对文件上传提供直接的支持,一般需要使用第三方框架来实现,这样就比较麻烦
不过,Servlet3.0之后提供了这个功能,而且使用非常简单,,为此,HTTPServletRequest提供了两个方法用于从请求中解析出上传的文件:

Part getPart(String name)  //获取请求中给定 name 的文件
Collection<Part> getParts() //获取所有的文件

其中每一个文件用一个javax.servlet.http.Part对象来表示,该接口提供了处理文件的简易方法,如write(),delete(),那么,结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单

Part img = request.getPart("img");
img.write("根路径+\\img.jpg")

注意:可以配合 @MultipartConfig 注解来对上传操作进行一些自定义的配置,比如限制上传文件的大小,以及保存文件的路径等,但是,如果请求的 MIME 类型不是 multipart/form-data,则不能使用上面的两个方法,否则将抛异常。

首先我们掌握开发Servlet的步骤:

前端:如果有前端内容的话,需要再写一个html文件
后端

  • 首先编写后台的Servlet代码(也即重写doGet和doPost方法)
  • 配置项目文件,web.xml里面的映射文件

1.首先写一个页面(前端) html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="img"><p>
    <input type="submit" value=" 提 交 ">
</form>
</body>
</html>

代码分析

2.写Servlet后端类代码

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;

//首先必须声明这个类是用来处理(文件)流的【不可获取】
@MultipartConfig
public class FileServlet extends HttpServlet {
    @Override
    //因为提交表单只需要post,那么这里就不需要get方法了
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首先拿到流信息,他返回的是一个part对象
        Part part = req.getPart("img");
        //手下声明一个保存路径,这里保存在D盘的File文件下
        String filePath = "D:\\File\\";
        //保存文件的名称这里就和原文件的名称一样,通过part里面的方法得到原文件名称
        String fileName = part.getSubmittedFileName();
        //通过write方法,可以将这个png文件保存在任意路径下,write里面的参数,就是要保存的路径
        part.write(filePath+fileName);

        //然后给前端返回响应的结果
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("<h1>上传成功</h1>");
    }}

3.配置web.xml映射

<servlet>
    <servlet-name>fileServlet</servlet-name>
    <servlet-class>FileServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>fileServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping>

4.效果展示

存在问题

那么哪里存在问题呢?

//首先拿到流信息,他返回的是一个part对象
        Part part = req.getPart("img");
        //手下声明一个保存路径,这里保存在D盘的File文件下
        String filePath = "D:\\File\\";
        //保存文件的名称这里就和原文件的名称一样,通过part里面的方法得到原文件名称
        String fileName = part.getSubmittedFileName();
        //通过write方法,可以将这个png文件保存在任意路径下,write里面的参数,就是要保存的路径
        part.write(filePath+fileName);

注意:其实这里是存在一点问题的

那么如何进行改进呢?

方法:使用UUID作为文件名

代码改进:也就是把代码中的fileName改成如下

//首先需要一个文件名,改进文件名的名称(防止重复名称覆盖之前的文件)
        String fileName = UUID.randomUUID().toString()+
                part.getSubmittedFileName().substring(part.getSubmittedFileName().indexOf("."));

结果验证

以上就是聊聊在Servlet中怎么上传文件的详细内容,更多关于Java Servlet上传文件的资料请关注我们其它相关文章!

时间: 2021-05-15

jsp+servlet简单实现上传文件功能(保存目录改进)

1.jsp前端 <%-- Created by IntelliJ IDEA. User: Lenovo Date: 2020/6/19 Time: 22:53 Learn from https://www.bilibili.com/video/BV18z411i7gh?t=23&p=192 To change this template use File | Settings | File Templates. --%> <%@ page contentType="te

android通过servlet上传文件到服务器

本文实例为大家分享了android通过servlet上传文件到服务器的具体代码,供大家参考,具体内容如下 服务器端:部署在Tomcat上,直接在myEclipse上开发即可 package com; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep

Jsp+Servlet实现文件上传下载 删除上传文件(三)

接着上一篇讲:Jsp+Servlet实现文件上传下载(二)--文件列表展示 本章来实现一下删除已上传文件,同时优化了一下第一章中的代码. 废话少说,上代码得意 1.调整列表页面list.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/j

J2EE Servlet上传文件到服务器并相应显示功能的实现代码

编辑上传文件的页面upload.html 注意事项:上传方式使用POST不能使用GET(GET不能上传文件) 表单 enctype 属性应该设置为 multipart/form-data.(表示提交的数据是二进制文件) upload.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传</title> </head>

java web中的servlet3 upload上传文件实践

Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作. 一.javax.servlet.http中Part接口 public interface Part 要上传文件必须使用multipart/form-data作为request body. 版本: Servl

servlet上传文件实现代码详解(四)

本文实例为大家分享了servlet上传文件的具体代码,供大家参考,具体内容如下 1.servlet上传文件 servlet上传文件就是将客户端的文件上传到服务器端. 向服务器发送数据时,客户端发送的http请求正文采用"multipart/form-data"数据类型,他表示复杂的多个子部分的复合表单. 为了简化"multipart/form-data"数据的处理过程.可以使用Apache组织提供是的两个开源包来来实现上传. fileupload软件包(common

PHP中TP5 上传文件的实例详解

php 文件上传 效果图: 实现代码: application\index\controller\Index.php <?php namespace app\index\controller; use think\Controller; use think\Request; class Index extends Controller { //文件上传表单 public function index() { return $this->fetch(); } //文件上传提交 public fu

Django框架静态文件处理、中间件、上传文件操作实例详解

本文实例讲述了Django框架静态文件处理.中间件.上传文件操作.分享给大家供大家参考,具体如下: Django静态文件处理.中间件.上传文件 静态文件处理 在Django中,一般专门创建一个static目录来存放静态文件(css,js,image,video等文件). a. 在创建目录前,我们需要配置静态文件的路径.如: #在项目的settings.py文件中,配置STATIC_URL,一般默认是: STATIC_URL = '/static/' # '/static/'是指uri,映射下面的

Jmeter post上传文件实现过程详解

上周五东西都收拾好了,然后被叫住加班,直接搞到凌晨一两点,原因是另一个项目的性能出了点问题.为此我抓包写了一下主业务流的接口,涉及到文件上传,记录一下吧. 一.创建线程组,添加各类组件 这个就不用说了.由于需要登录,所以我加了一个信息头管理器,把token写在里面. 二.文件上传 有接口文档的话,那就对着文档写,没api文档,就自己抓包看了.(注意:我在线程组下面加了http信息头管理器是因为我下面的"核对数据"和"预览发送"两个步骤需要这个Content-Type

JavaWeb实现文件上传与下载实例详解

在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,common-fileupload是依赖于c

Apache 文件上传与文件下载案例详解

写一个Apache文件上传与文件下载的案例:以供今后学习 web.xml配置如下: <span style="font-family:SimSun;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=&

FasfDFS整合Java实现文件上传下载功能实例详解

在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

Socket+JDBC+IO实现Java文件上传下载器DEMO详解

该demo实现的功能有: 1.用户注册: 注册时输入两次密码,若两次输入不一致,则注册失败,需要重新输入.若用户名被注册过,则提示用户重新输入用户名: 2.用户登录: 需要验证数据库中是否有对应的用户名和密码,若密码输错三次,则终止用户的登录操作: 3.文件上传: 从本地上传文件到文件数据库中 4.文件下载: 从数据库中下载文件到本地 5.文件更新: 根据id可更新数据库中的文件名 6.文件删除: 根据id删除数据库中某一个文件 7.看数据库所有文件; 8.查看文件(根据用户名); 9.查看文件

基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解

Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadify 好看一些,功能也强大些,本文主要基于我自己的框架代码案例,介绍其中文件上传插件File Input的使用. 1.文件上传插件File Input介绍 这个插件主页地址是:http://plugins.krajee.com/file-input,可以从这里看到很多Demo的代码展示:http:/