看书上(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文件上传!的更多相关文章

  1. 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题

    response.setContentType("text/html; charset=UTF-8");  Boolean isMultipart = ServletFileUpl ...

  2. JSP 文件上传下载系列之二[Commons fileUpload]

    前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是:  让添加强壮,高性能的文件到你的se ...

  3. JSP 文件上传

    JSP 文件上传 JSP可以通过HTML的form表单上传文件到服务器. 文件类型可以是文本文件.二进制文件.图像文件等其他任何文档. 创建文件上传表单 接下来我们使用HTML标签来创建文件上传表单, ...

  4. JSP-Runoob:JSP 文件上传

    ylbtech-JSP-Runoob:JSP 文件上传 1.返回顶部 1. JSP 文件上传 JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器.上传的文件可以是文本文件或图 ...

  5. jsp文件上传

    整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务 一客户端 先看最基本的情况 1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的.服务器更多的是对 ...

  6. JSP文件上传--Smartupload组件

    把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...

  7. jsp 文件上传操作

    文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...

  8. jsp文件上传、下载

    一.文件上传 上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等.....要实现文件上传功能,就需要综合利用java中的文件输入和输出相 ...

  9. JSP文件上传,好烦啊、、

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

随机推荐

  1. 请输出in.txt文件中的2 4 6 8 9 10 12行

    in.txt文件: 学号 姓名 性别 年龄 1001 张三 男 18 1002 赵四 男 19 1003 李丽 女 18 1004 刘芳 女 32 1005 王五 男 54 1006 小明 男 32 ...

  2. 设计模式UML图

    1.简单工厂模式 2.工厂模式 工厂模式与简单工厂模式的不同在于,每个操作类都有自己的工厂,而且把逻辑判断交给了客户端,而简单工厂的逻辑判断在工厂类里边,当增加新的操作类时,简单工厂需要修改工厂类,而 ...

  3. 2015-09-21CSS:引入方式、选择器、注释、文字样式

    1.HTML中引入CSS的方式 HTML中引入CSS的样式有4种:行内式.内嵌式.导入式和链接式. ⑴行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用 ...

  4. mac 查找当前目录下所有同一类型文件,并执行命令行

    以TexturePacker举例 MAC下用TexturePacker命令行打包当前目录下所有的 *.tps文件 1.配置好tps文件需要配置好路径.参数等.(也可不配置,用命令行实现.具体参考:ht ...

  5. jQuery图片滑动

    一个非常简单实用的jQuery插件 可以用在页面的顶部广告展示 http://slidesjs.com/ 一个需要注意的问题, 就是在手机等客户端(IOS8以上), 使用此插件时, 经常会触发插件的r ...

  6. jQuery截取字符串插件区分中英文

    jQuery截取字符串插件区分中英文:截取字符串功能在大量网站都有应用,比如新闻列表这样的功能,因为新闻的标题长途未必都是恰如其分的,所以要根据需要截取指定长度的字符串,下面就分享一个jQuery实现 ...

  7. [Python笔记]第四篇:内置函数

    本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...

  8. Python自动化运维之16、线程、进程、协程、queue队列

    一.线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行 ...

  9. JS读取文件,Javascript之文件操作 (IE)

    一.功能实现核心:FileSystemObject 对象      要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象. 二.FileSystemObject ...

  10. python3和Python2的区别(被坑太久了)

    print函数:(Python3中print为一个函数,必须用括号括起来:Python2中print为class) Python 2 的 print 声明已经被 print() 函数取代了,这意味着我 ...