不用外部JAR包,自己实现JSP文件上传!
看书上(JSP应用与开发技术)使用JSP文件上传,写了个真无语,压根就有很多问题,上传500KB的文件传过去后只剩350KB,而且编码必须是GBK、GB2312,否则传过去的文件都数据截取不正确。
琢磨了许久,发现问题出在
int startPos = ((file.substring(0,pos)).getBytes()).length;
//取得文件数据的结束的位置
int endPos =((file.substring(0,boundaryLocation)).getBytes()).length;
这里,问题就是根据字符串获取的字节数,然后从字节数组里截取根本就不正确。而后自己实现了个,不用字符串字节,而是自己以字节找字节。如下:
UploadTelRecord.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.DataInputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.File"%>
<%@page import="java.net.URLEncoder" %>
<!-- 上传通话录音文件 -->
<%!
//在字节数组里查找某个字节数组,找到返回>=0,未找到返回-1
private int byteIndexOf(byte[] data,byte[] search,int start)
{
int index=-1;
int len=search.length;
for(int i=start,j=0;i<data.length;i++)
{
int temp=i;
j=0;
while(data[temp]==search[j])
{
System.out.println((j+1)+",值:"+data[temp]+","+search[j]); //计数
j++;
temp++;
if(j==len)
{
index=i;
return index;
}
}
}
return index;
}
%>
<%
String getAction=request.getParameter("action");
if(getAction!=null&&(getAction.equals("upload"))) //上传文件
{
//定义上传的最大文件字节数1M
int MAX_SIZE=1024000;
String rootPath;
DataInputStream in=null;
FileOutputStream fileOut=null;
String remoteAddr=request.getRemoteAddr();
String serverName=request.getServerName();
String realPath=request.getRealPath("/");
realPath=realPath.substring(0,realPath.lastIndexOf("\\"));
//设置保存文件的目录
rootPath=realPath+ "\\upload\\telRecord\\";
//取得客户端上传的数据类型
String contentType=request.getContentType();
try{
if(contentType.indexOf("multipart/form-data")>=0){
in=new DataInputStream(request.getInputStream());
int formDataLength=request.getContentLength();
if(formDataLength>MAX_SIZE)
{
out.println("0,文件大小超过系统限制!");
out.flush();
return;
}
//保存上传的文件数据
byte dateBytes[]=new byte[formDataLength];
int byteRead=0;
int totalRead=0;
while(totalRead<formDataLength)
{
byteRead=in.read(dateBytes,totalRead,formDataLength);
totalRead+=byteRead;
}
String data=new String(dateBytes,"UTF-8");
//取得上传的文件名
String saveFile=data.substring(data.indexOf("filename=\"")+10);
saveFile=saveFile.substring(0,saveFile.indexOf("\n"));
saveFile=saveFile.substring(saveFile.lastIndexOf("\\")+1,saveFile.indexOf("\""));
//取得数据分割字符串
int lastIndex=contentType.lastIndexOf("="); //数据分割线开始位置boundary=---------------------------
String boundary=contentType.substring(lastIndex+1,contentType.length());//---------------------------257261863525035
//计算开头数据头占用的长度
int startPos;
startPos=byteIndexOf(dateBytes,"filename=\"".getBytes(),0);
startPos=byteIndexOf(dateBytes,"\n".getBytes(),startPos)+1; //遍历掉3个换行符到数据块
startPos=byteIndexOf(dateBytes,"\n".getBytes(),startPos)+1;
startPos=byteIndexOf(dateBytes,"\n".getBytes(),startPos)+1;
//边界位置
int endPos=byteIndexOf(dateBytes,boundary.getBytes(),(dateBytes.length- startPos))-4;
//创建文件
String fileName=rootPath+saveFile;
File checkFile=new File(fileName);
if(checkFile.exists()){
out.println("0,文件已经存在!");
out.flush();
return;
}
File fileDir=new File(rootPath);
if(!fileDir.exists())
fileDir.mkdirs();
//写入文件
fileOut=new FileOutputStream(fileName);
fileOut.write(dateBytes,startPos,(endPos-startPos));
fileOut.flush();
out.println("文件上传成功!保存在:"+fileName);
}
else
{
out.println("0,未找到上传文件!");
out.flush();
return;
}
}catch(Exception error)
{
out.println("发生异常:"+error.getMessage());
}
finally
{
try
{
if(in!=null)
in.close();
if(fileOut!=null)
fileOut.close();
}catch(Exception e ){}
}
out.println("<br><br>");
out.println("<a href='UploadTelRecord.jsp'>继续上传</a>");
return;
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传通话记录</title>
</head>
<body style="margin:50px;">
<p>请选择您要上传的通话录音文件,文件命名格式为:通话时间_手机号_联系人姓名.后缀,没有联系人姓名请置空,如:
111213123123_10086_中国移动.amr,没有姓名则为111213123123_10086_.amr</p>
<form method="POST" action="UploadTelRecord.jsp?action=upload" ENCTYPE="multipart/form-data">
<input type="file" name="file1" size="30"><br/>
<input type="submit" value="开始上传">
</form>
</body>
</html>
不用外部JAR包,自己实现JSP文件上传!的更多相关文章
- 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题
response.setContentType("text/html; charset=UTF-8"); Boolean isMultipart = ServletFileUpl ...
- JSP 文件上传下载系列之二[Commons fileUpload]
前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是: 让添加强壮,高性能的文件到你的se ...
- JSP 文件上传
JSP 文件上传 JSP可以通过HTML的form表单上传文件到服务器. 文件类型可以是文本文件.二进制文件.图像文件等其他任何文档. 创建文件上传表单 接下来我们使用HTML标签来创建文件上传表单, ...
- JSP-Runoob:JSP 文件上传
ylbtech-JSP-Runoob:JSP 文件上传 1.返回顶部 1. JSP 文件上传 JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器.上传的文件可以是文本文件或图 ...
- jsp文件上传
整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务 一客户端 先看最基本的情况 1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的.服务器更多的是对 ...
- JSP文件上传--Smartupload组件
把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...
- jsp 文件上传操作
文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...
- jsp文件上传、下载
一.文件上传 上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等.....要实现文件上传功能,就需要综合利用java中的文件输入和输出相 ...
- JSP文件上传,好烦啊、、
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
随机推荐
- dns-prefetch—DNS预解析技术
今天在看一个网站的源代码时 发现了 <link rel="dns-prefetch" href="//static.tuweia.cn/"> 对dn ...
- 开源的Android开发框架-------PowerFramework使用心得(一)总体介绍
PowerFramework是一款几乎囊括了所有Android基础功能的框架应用,这个框架目前是开源的,开发者可以在这个框架的基础上进行二次开发.结合开发者自己的UI设计,可以很快就能开发出具备基础应 ...
- 关于模板中的动态取值 ---反射与javascript脚本编译
在项目中经常遇到一个问题,打印word或者打印excel的时候,我们经常使用一对一的赋值或者批量替换的方式来对模板进行修改. 但是现在遇到两种场景: 1.取值是通过自定以方法进行取值的. 如:一个销售 ...
- uva 11529 Strange Tax Calculation (几何+计数)
题目链接: http://vjudge.net/problem/viewProblem.action?id=18277 这题暴力n^4妥妥的TLE!即使n^3也可能会T 正确的姿势应该是:枚举每个点作 ...
- 【USACO 2.4.2】穿越栅栏
[描述] 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找 ...
- centos账户管理命令(root权限)
cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 查看所有用户 userdel -r 用户名 -删除用户 ...
- JavaScript设计模式之建造者模式
一.建造者模式模式概念 建造者模式可以将一个复杂的对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类型就可以得到它们,而具体 ...
- ul ol 列表的样式的控制
ul( Unordered List)无序列表 ol(Ordered List)有序列表 列表的样式: 列表原有符号.自定义图形符号.符号显示位置. 1.列表符号 是显示于每一个列表项目前的符号标识. ...
- UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)
紫书例题p245 Piotr found a magical box in heaven. Its magic power is that if you place any red balloon i ...
- UVA 572 Oil Deposits油田(DFS求连通块)
UVA 572 DFS(floodfill) 用DFS求连通块 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format: ...