`
444878909
  • 浏览: 638011 次
文章分类
社区版块
存档分类
最新评论

不用外部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>




分享到:
评论

相关推荐

    spring4.3.9相关jar包

    spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-fileupload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力 commons-io 用来帮助进行IO功能开发.它包含三个主要的领域:Utility classes-提供一些静态方法来完成公共任务.Filters-...

    various-simple-examples:各种示例集,易于使用(VUESpringBootThymeleafJettySSHSSMElasticSearchRabbitMQlombokJerseyWebSocketShardingJDBCREST)

    :springboot+jsp+外部tomcat+引用外部jar包 打包成war包 :springboot 结合 Thymeleaf Thymeleaf 模板引擎国际化操作 :springboot 结合 shiro 实现简单登入验证权限操作 :springboot 原生上传文件操作(包含 ...

    java开源包4

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java开源包3

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    JAVA上百实例源码以及开源项目源代码

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    java开源包8

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包1

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包2

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包11

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包6

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包5

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包10

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包7

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包9

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    java开源包101

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    Java资源包01

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    JAVA 范例大全 光盘 资源

    实例202 简单的JSP上传文件 661 实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 ...

Global site tag (gtag.js) - Google Analytics