首页 > 其他分享 >Servlet上传

Servlet上传

时间:2023-05-09 10:23:36浏览次数:30  
标签:文件 String Servlet request fileName import 上传

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;

/**
* @WebServlet用于替代web.xml减少配置
*/
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
//上传文件存储目录
private static final String UPLOAD_DIRECTORY="/WEB-INF/upload";
//临时文件存储目录
private static final String TEMP_DIRECTORY="/WEB-INF/temp";

// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB

/**
* 上传数据及保存文件
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//通过让服务器与浏览器编码方式一致,解决中文乱码
request.setCharacterEncoding("UTF-8");
// 检测是否为多媒体上传
if (!ServletFileUpload.isMultipartContent(request)) {
// 如果不是则停止
PrintWriter writer = response.getWriter();
writer.println("Error: 表单必须包含 enctype=multipart/form-data");
writer.flush();
return;
}
String message="";
// 配置上传参数,创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时存储目录
String tempPath = this.getServletContext().getRealPath(TEMP_DIRECTORY);
File tempFile = new File(tempPath);
if (!tempFile.exists() && !tempFile.isDirectory()) {
// 创建临时目录
tempFile.mkdir();
}

//创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);

// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);

// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
// 中文处理
upload.setHeaderEncoding("UTF-8");
// 构造临时路径来存储上传的文件
// 这个路径相对当前应用的目录
String uploadPath = request.getServletContext().getRealPath(UPLOAD_DIRECTORY);

// 如果目录不存在则创建
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}

try {
// 解析请求的内容提取文件数据
@SuppressWarnings("unchecked")
List<FileItem> formItems = upload.parseRequest(request);

if (formItems != null && formItems.size() > 0) {
// 迭代表单数据
for (FileItem item : formItems) {
// 处理不在表单中的字段
if (!item.isFormField()) {
// 得到上传的文件名
String fileName = new File(item.getName()).getName();
if (fileName == null || fileName.trim().equals("")) {
message="上传文件不存在!";
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
// 得到上传文件的扩展名
String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);
// 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:" + fileExtName);
// 得到文件保存的名称
String saveFilename = makeFileName(fileName);
System.out.println("文件保存名:"+saveFilename);
//文件上传路径
String filePath = uploadPath + File.separator + saveFilename;
// 在控制台输出文件的上传路径
System.out.println("文件上传路径"+filePath);

File storeFile = new File(filePath);
// 保存文件到硬盘
item.write(storeFile);
message="文件上传成功!";
}
}
}
} catch (Exception ex) {
request.setAttribute("message", "错误信息: " + ex.getMessage());
}
request.setAttribute("message", message);
// 跳转到 message.jsp
request.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
}

private String makeFileName(String fileName) {
// 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
return UUID.randomUUID().toString() + "_" + fileName;
}


}

标签:文件,String,Servlet,request,fileName,import,上传
From: https://www.cnblogs.com/cpp826/p/17384084.html

相关文章

  • linux yum明明已经安装lzszz上传文件提示命令零错误
    遇到错误如下:Loadedplugins:fastestmirror,refresh-packagekit,securityDeterminingfastestmirrorsYumRepoError:AllmirrorURLsarenotusingftp,http[s]orfile.Eg.Invalidrelease/repo/archcombination/removingmirrorlistwithnovalidmirrors:/var......
  • Webflux上传文件
    Webflux上传文件时,需要通过FilePart接收文件@PostMapping("/upload")publicMono<String>upload(@RequestPart("upload")FilePartupload){Filefile=newFile("E:\\temp\\upload.text");returnupload.transferTo(file).map(e->......
  • 有关servlet实现文件下载
    废话不多说,上代码1packagecom.mlq.servlet;23importcom.sun.net.httpserver.HttpsServer;45importjavax.servlet.ServletException;6importjavax.servlet.ServletOutputStream;7importjavax.servlet.http.HttpServlet;8importjavax.servlet.http.H......
  • TEXT_CONVERT_XLS_TO_SAP-上传EXCEL文件
    *&---------------------------------------------------------------------**&ReportZ018*&*&---------------------------------------------------------------------**&*&上传Excel文件*&--------------------------------------------......
  • GUI_UPLOAD-上传txt文件
    *&---------------------------------------------------------------------**&ReportZ016*&*&---------------------------------------------------------------------**&*&上传TXT文件*&----------------------------------------------......
  • 大文件分片上传前后端实现
    1.前端代码<template><divclass="upload_container"><el-progress:percentage="progressNum"/><inputtype="file"ref="file"@change="selectFile"/><el-buttontype=&qu......
  • vue3 证件识别上传组件封装
    证件图片识别上传根据业务需要,经常涉及到证件上传,例如身份证上传、银行卡、营业执照等信息,根据设计师的设计,单独封装了一个上传组件。识别接口后端用的是阿里云的。上传组件用的是element-plusel-upload上代码:<template><divclass="component-upload-image"><el-up......
  • java--Servlet以及Mvc的实现
    ServletServlet的生命周期Servlet的生命周期可以分为四个步骤:实例化。当Web容器(如Tomcat)启动时,会首先加载Servlet类,并创建Servlet实例。这一过程通常在应用程序启动时完成。初始化。接着容器会调用Servlet实例的init()方法来进行初始化操作。在这个方法中,通......
  • 11-GenericServlet
    1.我们编写一个Servlet类直接实现Servlet接口有什么缺点?我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。2.适配器设计模式Adapter适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使......
  • 文件上传框样式
    关键字:文件上传框样式附件是已经实现的现成的文件框的样式,直接部署即可,或者直接将其中的index.jsp放到您的项目中运行就可以看效果了,希望能帮到大家,谢谢!!!......