文件上传java逻辑_Java 文件上传 实例

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class Upload {

private String saveDir = "."; // 要保存文件的路径

private String contentType = ""; // 文档类型

private String charset = ""; // 字符集

private ArrayList tmpFileName = new

ArrayList(); // 临时存放文件名的数据结构

private Hashtable parameter = new Hashtable();

// 存放参数名和值的数据结构

private ServletContext context; //

程序上下文,用于初始化

private HttpServletRequest request; //

用于传入请求对象的实例

private String boundary = ""; // 内存数据的分隔符

private int len = 0; // 每次从内在中实际读到的字节长度

private String queryString;

private int count; // 上载的文件总数

private String[] fileName; // 上载的文件名数组

private long maxFileSize = 1024 * 1024 * 10;

// 最大文件上载字节;

private String tagFileName = "";

public final void init(HttpServletRequest

request) throws ServletException {

this.request = request;

boundary =

request.getContentType().substring(30); // 得到内存中数据分界符

queryString =

request.getQueryString();

}

public String getParameter(String s) { //

用于得到指定字段的参数值,重写request.getParameter(String

// s)

if (parameter.isEmpty())

{

return

null;

}

return (String)

parameter.get(s);

}

public String[] getParameterValues(String s) {

// 用于得到指定同名字段的参数数组,重写request.getParameterValues(String

// s)

ArrayList al = new

ArrayList();

if (parameter.isEmpty())

{

return

null;

}

Enumeration e =

parameter.keys();

while (e.hasMoreElements())

{

String key =

(String) e.nextElement();

if (-1 !=

key.indexOf(s + "||||||||||") || key.equals(s)) {

al.add(parameter.get(key));

}

}

if (al.size() == 0) {

return

null;

}

String[] value = new

String[al.size()];

for (int i = 0; i

< value.length; i++) {

value[i] =

(String) al.get(i);

}

return value;

}

public String getQueryString() {

return queryString;

}

public int getCount() {

return count;

}

public String[] getFileName() {

return fileName;

}

public void setMaxFileSize(long size) {

maxFileSize = size;

}

public void setTagFileName(String filename)

{

tagFileName = filename;

}

public void setSaveDir(String saveDir) { //

设置上载文件要保存的路径

this.saveDir = saveDir;

File testdir = new

File(saveDir); // 为了保证目录存在,如果没有则新建该目录

if (!testdir.exists()) {

testdir.mkdirs();

}

}

public void setCharset(String charset) { //

设置字符集

this.charset = charset;

}

public boolean uploadFile() throws

ServletException, IOException { // 用户调用的上载方法

setCharset(request.getCharacterEncoding());

return

uploadFile(request.getInputStream());

}

private boolean uploadFile(ServletInputStream

servletinputstream) throws // 取得央存数据的主方法

ServletException,

IOException {

String line = null;

byte[] buffer = new

byte[256];

while ((line = readLine(buffer,

servletinputstream, charset)) != null) {

if

(line.startsWith("Content-Disposition: form-data;")) {

int

i = line.indexOf("filename=");

if

(i >= 0) { //

如果一段分界符内的描述中有filename=,说明是文件的编码内容

String

fName = getFileName(line);

if

(fName.equals("")) {

continue;

}

if

(count == 0 && tagFileName.length()

!= 0) {

String

ext = fName

.substring((fName.lastIndexOf(".")

+ 1));

fName

= tagFileName + "." + ext;

}

tmpFileName.add(fName);

count++;

while

((line = readLine(buffer, servletinputstream, charset)) != null)

{

if

(line.length() <= 2) {

break;

}

}

File

f = new File(saveDir, fName);

FileOutputStream

dos = new FileOutputStream(f);

long

size = 0l;

while

((line = readLine(buffer, servletinputstream, null)) != null)

{

if

(line.indexOf(boundary) != -1) {

break;

}

size

+= len;

if

(size > maxFileSize) {

throw

new IOException("文件超过" + maxFileSize + "字节!");

}

dos.write(buffer,

0, len);

}

dos.close();

}

else { // 否则是字段编码的内容

String

key = getKey(line);

String

value = "";

while

((line = readLine(buffer, servletinputstream, charset)) != null)

{

if

(line.length() <= 2) {

break;

}

}

while

((line = readLine(buffer, servletinputstream, charset)) != null)

{

if

(line.indexOf(boundary) != -1) {

break;

}

value

+= line;

}

put(key,

value.trim(), parameter);

}

}

}

if (queryString != null)

{

String[] each

= split(queryString, "&");

for (int k =

0; k < each.length; k++) {

String[]

nv = split(each[k], "=");

if

(nv.length == 2) {

put(nv[0],

nv[1], parameter);

}

}

}

fileName = new

String[tmpFileName.size()];

for (int k = 0; k

< fileName.length; k++) {

fileName[k] =

(String) tmpFileName.get(k); // 把ArrayList中临时文件名倒入数据中供用户调用

}

if (fileName.length == 0)

{

return false;

// 如果fileName数据为空说明没有上载任何文件

}

return true;

}

private void put(String key, String value,

Hashtable ht) {

if (!ht.containsKey(key))

{

ht.put(key,

value);

} else { //

如果已经有了同名的KEY,就要把当前的key更名,同时要注意不能构成和KEY同名

try {

Thread.currentThread().sleep(1);

// 为了不在同一ms中产生两个相同的key

} catch

(Exception e) {

}

key +=

"||||||||||" + System.currentTimeMillis();

ht.put(key,

value);

}

}

private String readLine(byte[] Linebyte,

ServletInputStream

servletinputstream, String charset) {

try {

len =

servletinputstream.readLine(Linebyte, 0, Linebyte.length);

if (len ==

-1) {

return

null;

}

if (charset

== null) {

return

new String(Linebyte, 0, len);

} else

{

return

new String(Linebyte, 0, len, charset);

}

} catch (Exception _ex)

{

return

null;

}

}

private String getFileName(String line) { //

从描述字符串中分离出文件名

if (line == null) {

return

"";

}

int i =

line.indexOf("filename=");

line = line.substring(i +

9).trim();

i = line.lastIndexOf("");

if (i < 0 || i

>= line.length() - 1) {

i =

line.lastIndexOf("\\");

if

(line.equals("\"\"")) {

return

"";

}

if (i

< 0 || i >= line.length() - 1)

{

return

line;

}

}

return line.substring(i + 1,

line.length() - 1);

}

private String getKey(String line) {

//从描述字符串中分离出字段名

if (line == null) {

return

"";

}

int i =

line.indexOf("name=");

line = line.substring(i +

5).trim();

return line.substring(1,

line.length() - 1);

}

public static String[] split(String strOb,

String mark) {

if (strOb == null) {

return

null;

}

StringTokenizer st = new

StringTokenizer(strOb, mark);

ArrayList tmp = new

ArrayList();

while (st.hasMoreTokens())

{

tmp.add(st.nextToken());

}

String[] strArr = new

String[tmp.size()];

for (int i = 0; i

< tmp.size(); i++) {

strArr[i] =

(String) tmp.get(i);

}

return strArr;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab数值计算pdf_Gnuplot科学绘图(九)——栅格以及方程数值解估算

Gnuplot科学绘图系列内容Gnuplot科学绘图(一)——从安装到简单函数绘图(文末有彩蛋)Gnuplot科学绘图(二)——坐标取值范围及刻度(文末有彩蛋)Gnuplot科学绘图(三)——点线风格Gnuplot科学绘图(四)——多组数据绘图Gnuplot科学绘图(五)——输出eps 图片Gnuplot科学绘图(六)——输…

dda算法_计算机图形学中的DDA(数字差分分析仪)算法

dda算法DDA(数字差分分析仪)算法 (DDA (Digital Differential Analyzer) Algorithm) In computer graphics, the DDA algorithm is the simplest algorithm among all other line generation algorithms. Here, the DDA is an abbreviation that stands for "Digital Diff…

购物商城框架java_基于jsp的购物商城-JavaEE实现购物商城 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的购物商城, 该项目可用各类java课程设计大作业中, 购物商城的系统架构分为前后台两部分, 最终实现在线上进行购物商城各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类购物商城相关的实体进行管理。该购物…

c语言++数组名【数字】_C ++程序在数组中打印所有非重复数字

c语言数组名【数字】Problem statement: Write a C program to print all the non-repeated numbers in an array in minimum time complexity. 问题陈述&#xff1a;编写一个C 程序&#xff0c; 以最小的时间复杂度将所有未重复的数字打印在数组中 。 Input Example: 输入示例…

java最接近对点及距离_最接近点对问题_分治法

一、问题描述给定平面上的n个点&#xff0c;找其中的一对点&#xff0c;使得在n个点组成的所有点对中该点对间的距离最小。二、解题思路及所选算法策略的可行性分析思路&#xff1a;利用分治法来解决问题。递归子结构求最接近点对总体可分为几个步骤&#xff1a;1、当问题规模小…

python return用法_初学Python要了解什么 装饰器知识汇总有哪些

初学Python要了解什么&#xff1f;装饰器知识汇总有哪些&#xff1f;在Python学习过程中&#xff0c;有多种方法对函数和类进行加工&#xff0c;相对于其它方式&#xff0c;装饰器语法简单&#xff0c;代码可读性高。因此&#xff0c;装饰器在Python项目中有广泛的应用&#xf…

android emulator虚拟设备分析第三篇之pipe上的qemud service

一、概述 本篇和第二篇是强相关的&#xff0c;需要结合第二篇一起看。 以boot-properties为例&#xff0c;注意不需要看ANDROID-QEMUD.TXT&#xff0c;这个是和guest os中的qemud进行相关的&#xff0c;已废弃。 启动emulator时&#xff0c;有一个参数-prop <key><val…

c#异常处理_C#异常处理能力问题和解答 套装4

c#异常处理1) Which is not a valid keyword used in the context of exception handling? trycatchfinalfinally Answer & Explanation Correct answer: 3final The final keyword is not used to handle exceptions in C#.NET. 1)在异常处理的上下文中使用哪个无效关键字…

Castor xsd生成java_java – Castor可以处理从基础XSD导入的多个XSD生成类吗?

注意&#xff1a;我是EclipseLink JAXB (MOXy)领导者,也是JAXB 2 (JSR-222)专家组的成员.Can Castor do this? If so, what would be the Ant task syntax for it.If not, would perhaps JAXB be a better alternative?下面是如何使用JAXB完成此操作的示例&#xff1a;产品xm…

串口通信 校验码_一文读懂S7-200 SMART自由口通信!

学习S7-200 SMART时了解到&#xff0c;基于RS485接口可实现一下几种通信&#xff1a;1&#xff09;modbus RTU通信2&#xff09;PPI协议通信3&#xff09;USS协议通信4&#xff09;自由口通信何为自由口通信呢&#xff1f;前三种通信必须要PLC和与其通信的设备支持相同的通信协…

hbase 学习(十三)集群间备份原理

集群建备份&#xff0c;它是master/slaves结构式的备份&#xff0c;由master推送&#xff0c;这样更容易跟踪现在备份到哪里了&#xff0c;况且region server是都有自己的WAL 和HLog日志&#xff0c;它就像mysql的主从备份结构一样&#xff0c;只有一个日志来跟踪。一个master集…

python expect模块_Python基础教程:用Python怎么telnet到网络设备

Python基础教程&#xff1a;用Python怎么telnet到网络设备0.前言Telnet协议属于TCP/IP协议族里的一种&#xff0c;对于我们这些网络攻城狮来说&#xff0c;再熟悉不过了&#xff0c;常用于远程登陆到网络设备进行操作&#xff0c;但是&#xff0c;它的缺陷太明显了&#xff0c;…

Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

[Java教程]动态加载页面数据的小工具 javascript jQuery (持续更新)0 2014-05-07 18:00:06使用该控件&#xff0c;可以根据url&#xff0c;参数&#xff0c;加载html记录模板(包含json参数对应&#xff0c;以及具体记录位置Index根据参数描述加载对应的属性&#xff0c;并可以…

马哥linux第六周作业

1、复制/etc/rc.d/rc.sysinit文件至/tmp目录&#xff0c;将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#&#xff1b;[rootmageedu tmp]# cp /etc/rc.d/rc.sysinit . [rootmageedu tmp]# vim rc.sysinit :% s/^[[:space:]]/#&/ #按Esc进入vi…

Java ObjectInputStream enableResolveObject()方法与示例

ObjectInputStream类enableResolveObject()方法 (ObjectInputStream Class enableResolveObject() method) enableResolveObject() method is available in java.io package. enableResolveObject()方法在java.io包中可用。 enableResolveObject() method is used to enable th…

pygame render怎么显示中文_PyGame开发游戏(2D)02.基础图元

这节将介绍PyGame的基础架构。并学习如何在PyGame里绘制各种几何图形和显示加载图片。01.应用框架上一节的示例程序里&#xff0c;我们用到一个PyGame的应用程序框架。这是一个基础框架&#xff0c;利用它我们可以很轻松的添加各类图型绘制&#xff0c;键盘鼠标输入处理和各类逻…

word+增加水印+java_为Word2019文档添加水印的两种方法

水印的类型包括文字水印和图片水印两种。在Word文档中添加文字水印时&#xff0c;可以使用程序中预设的水印效果&#xff0c;而图片水印则需要自定义添加。一、使用程序预设的文字水印Word 2019中预设了机密、紧急、免责声明三种类型的文字水印&#xff0c;用户可根据文件的类型…

如何设置CentOS 7获取动态及静态IP地址

自动获取动态IP地址1.输入“ip addr”并按回车键确定&#xff0c;发现无法获取IP(CentOS 7默认没有ifconfig命令)&#xff0c;记录下网卡名称&#xff08;本例中为ens33&#xff09;。2.输入“cd /etc/sysconfig/network-scripts/”按回车键确定&#xff0c;继续输入“ls”按回…

请求列出指定服务器上的可用功能失败_滥用 ESI 详解(上)

在进行安全性评估时&#xff0c;我们注意到了标记语言 Edge Side Includes (ESI)中的一个意外行为&#xff0c;这种语言用于许多流行的 HTTP 代理(反向代理、负载平衡器、缓存服务器、代理服务器)。我们发现成功的 ESI 攻击可以导致服务器端请求伪造(SSRF)、各种绕过 HTTPOnly …

Java ClassLoader setPackageAssertionStatus()方法与示例

ClassLoader类setPackageAssertionStatus()方法 (ClassLoader Class setPackageAssertionStatus() method) setPackageAssertionStatus() method is available in java.lang package. setPackageAssertionStatus()方法在java.lang包中可用。 setPackageAssertionStatus() metho…