关于JSP from enctype=MULTIPART/FORM-DATA取不到数据的解决方法

2024-01-07 14:58

本文主要是介绍关于JSP from enctype=MULTIPART/FORM-DATA取不到数据的解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于JSP <from enctype="MULTIPART/FORM-DATA"取不到数据的解决方法

自己在项目中,不用别人的开源包,也碰到了这样的情况,在网上查了好多文章,没见到有好的解决方案,特此写出此文章,希望能帮到你.方法如下:

UploadBean.java

package test.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

/**
*
*
*
* Title: 文件上传类
*
* Description: 既能对文件进行上传,又能取得输入框的值,最多可同时上传255个文件
*
* Copyright: Copyright (c) 2008
*
* @version 1.0
*
*/

public class UploadBean {
private String[] sourceFile = new String[255]; // 源文件名

private String[] suffix = new String[255]; // 文件后缀名

private String canSuffix = ".gif.jpg.jpeg.png"; // 可上传的文件后缀名

private String objectPath = "c:/"; // 目标文件目录

private String[] objectFileName = new String[255]; // 目标文件名

private ServletInputStream sis = null; // 输入流

private String[] description = new String[255]; // 描述状态

private long size = 100 * 1024; // 限制大小

private int count = 0; // 已传输文件数目

private byte[] b = new byte[4096]; // 字节流存放数组

private boolean successful = true;

private Hashtable fields = new Hashtable();

public UploadBean() {

}

// 设置上传文件的后缀名

public void setSuffix(String canSuffix) {
   this.canSuffix = canSuffix;
}

// 设置文件保存路径
public void setObjectPath(String objectPath) {
   this.objectPath = objectPath;
}

// 设置文件保存路径
public void setSize(long maxSize) {
   this.size = maxSize;
}

// 文件上传处理程序
public void setSourceFile(HttpServletRequest request) throws IOException {
   sis = request.getInputStream();
   int a = 0;
   int k = 0;
   String s = "";
   while ((a = sis.readLine(b, 0, b.length)) != -1) {
    s = new String(b, 0, a);
    if ((k = s.indexOf("filename=/"")) != -1) {
     // 取得文件数据
     s = s.substring(k + 10);
     k = s.indexOf("/"");
     s = s.substring(0, k);
     sourceFile[count] = s;
     k = s.lastIndexOf(".");
     suffix[count] = s.substring(k + 1);
     if (canTransfer(count)) {
      transferFile(count);
     }
     ++count;
    } else if ((k = s.indexOf("name=/"")) != -1) {
     // 普通表单输入元素,获取输入元素名字
     String fieldName = s.substring(k + 6, s.length() - 3);
     sis.readLine(b, 0, b.length);
     StringBuffer fieldValue = new StringBuffer(b.length);
     while ((a = sis.readLine(b, 0, b.length)) != -1) {
      s = new String(b, 0, a - 2);
      if ((b[0] == 45) && (b[1] == 45) && (b[2] == 45)
        && (b[3] == 45) && (b[4] == 45)) {
       break;
      } else {
       fieldValue.append(s);
      }
     }
     fields.put(fieldName, fieldValue.toString());
    }
    if (!successful)
     break;
   }
}

// 取得表单元素值
public String getFieldValue(String fieldName) {
   if (fields == null || fieldName == null) {
    return null;
   }
   return (String) fields.get(fieldName);
}

// 取得上传文件数
public int getCount() {
   return count;
}

// 取得目标路径
public String getObjectPath() {
   return objectPath;
}

// 取得源文件名
public String[] getSourceFile() {
   return sourceFile;
}

// 取得目标文件名

public String[] getObjectFileName() {
   return objectFileName;
}

// 取得上传状态描述

public String[] getDescription() {
   return description;
}

// 判断上传文件的类型

private boolean canTransfer(int i) {
   suffix[i] = suffix[i].toLowerCase();
   // 这个是用来传图片的,各位可以把后缀名改掉或者不要这个条件
   if (sourceFile[i].equals("")
     || (!(canSuffix.indexOf("." + suffix[i]) >= 0))) {
    description[i] = "ERR: File suffix is wrong.";
    return false;
   }
   else {
    return true;
   }
}

// 上传文件转换
private void transferFile(int i) {
   String x = Long.toString(new java.util.Date().getTime());
   try {
    objectFileName[i] = x + "." + suffix[i];
    FileOutputStream out = new FileOutputStream(objectPath
      + objectFileName[i]);
    int a = 0;
    int k = 0;
    long hastransfered = 0; // 标示已经传输的字节数
    String s = "";
    while ((a = sis.readLine(b, 0, b.length)) != -1) {
     s = new String(b, 0, a);
     if ((k = s.indexOf("Content-Type:")) != -1) {
      break;
     }
    }
    sis.readLine(b, 0, b.length);
    while ((a = sis.readLine(b, 0, b.length)) != -1) {
     s = new String(b, 0, a);
     if ((b[0] == 45) && (b[1] == 45) && (b[2] == 45)
       && (b[3] == 45) && (b[4] == 45)) {
      break;
     }
     out.write(b, 0, a);
     hastransfered += a;
     if (hastransfered >= size) {
      description[count] = "ERR: The file " + sourceFile[count] +
      " is too large to transfer. The whole process is interrupted.";
      successful = false;
      break;
    }
    }

    if (successful) {
     description[count] = "Right: The file " + sourceFile[count] +
     " has been transfered successfully.";
    }
    out.close();
    if (!successful) {
     sis.close();
     File tmp = new File(objectPath + objectFileName[count]);
     tmp.delete();
    }
   }
   catch (IOException ioe) {
    description[i] = ioe.toString();
   }
}

}

--------------------------------------------

<body>
   <form action="UploadSubmit.jsp" enctype="MULTIPART/FORM-DATA"
    method="post">

    作者姓名:
    <input type="text" name="Author" />

    <br />

    公司名称:
    <input type="text" name="Company" />

    <br />


    选择文件1:
    <input type="file" name="filename1" />

    <br />

    选择文件2:
    <input type="file" name="filename2" />

    <br />

    选择文件3:
    <input type="file" name="filename3" />

    <br />

    <input type="submit" value="上载" />

   </form>

</body>

-----------------------------------------

UploadSubmit.jsp

<%@ page contentType="text/html;charset=gb2312"%>

<jsp:useBean id="fileBean" scope="page" class="test.servlet.UploadBean" />

<%
    fileBean.setObjectPath("D:/Temp");
   
    fileBean.setSize(10000*1024);
   
    fileBean.setSuffix(".gif.jpg.png.jpge");
   
    fileBean.setSourceFile(request);
   
    String [] saSourceFile = fileBean.getSourceFile();
   
    String [] saObjectFile = fileBean.getObjectFileName();
   
    String [] saDescription = fileBean.getDescription();
   
    int iCount = fileBean.getCount();
   
    String sObjectPath = fileBean.getObjectPath();
   
    for(int i=0;i<iCount;i++) {
   
     out.println("<br>源始文件:");
   
     out.println(saSourceFile[i]);
   
     out.println("<br>目标文件:");
   
     out.println(sObjectPath+saObjectFile[i]);
   
     out.println("<br>上传说明:");
   
     out.println(saDescription[i]);
   
     out.println("<br>");
   
    }
   
    out.println("<br>作者:" + fileBean.getFieldValue("Author"));
   
    out.println("<br>公司:" + fileBean.getFieldValue("Company"));

%>

这篇关于关于JSP from enctype=MULTIPART/FORM-DATA取不到数据的解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580292

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施: