zoukankan      html  css  js  c++  java
  • 用JSP实现文件上传功能

    UploadExample.jsp

    <%@ page contentType="text/html;charset=gb2312"%>
    <html>
    <title><%= application.getServerInfo() %></title>
    <body>

    上传文件程序应用示例
    <form action="doUpload.jsp" method="post" enctype="multipart/form-data">

    <%-- 类型enctype用multipart/form-data,这样可以把文件中的数据作为流式数据上传,不管是什么文件类型,均可上传。--%>
    请选择要上传的文件<input type="file" name="upfile" size="50">
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    doUpload.jsp

    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.io.*"%>
    <%@ page import="java.util.*"%>
    <%@ page import="javax.servlet.*"%>
    <%@ page import="javax.servlet.http.*"%>
    <html><head><title>upFile</title></head>
    <body bgcolor="#ffffff">
    <%
    //定义上载文件的最大字节
    int MAX_SIZE = 102400 * 102400;
    // 创建根路径的保存变量
    String rootPath;
    //声明文件读入类
    DataInputStream in = null;
    FileOutputStream fileOut = null;
    //取得客户端的网络地址
    String remoteAddr = request.getRemoteAddr();

    //获得服务器的名字
    String serverName = request.getServerName();


    //取得互联网程序的绝对地址
    String realPath = request.getRealPath(serverName);

    realPath = realPath.substring(0,realPath.lastIndexOf("\"));

    //创建文件的保存目录
    rootPath = realPath + "\upload\";

    //取得客户端上传的数据类型
    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("<P>上传的文件字节数不可以超过" + MAX_SIZE + "</p>");
    return;
    }
    //保存上传文件的数据
    byte dataBytes[] = new byte[formDataLength];
    int byteRead = 0;
    int totalBytesRead = 0;
    //上传的数据保存在byte数组
    while(totalBytesRead < formDataLength){
    byteRead = in.read(dataBytes,totalBytesRead,formDataLength);
    totalBytesRead += byteRead;
    }
    //根据byte数组创建字符串
    String file = new String(dataBytes);
    //out.println(file);
    //取得上传的数据的文件名
    String saveFile = file.substring(file.indexOf("filename="") + 10);
    saveFile = saveFile.substring(0,saveFile.indexOf(" "));
    saveFile = saveFile.substring(saveFile.lastIndexOf("\") + 1,saveFile.indexOf("""));
    int lastIndex = contentType.lastIndexOf("=");
    //取得数据的分隔字符串
    String boundary = contentType.substring(lastIndex + 1,contentType.length());
    //创建保存路径的文件名
    String fileName = rootPath + saveFile;
    //out.print(fileName);
    int pos;
    pos = file.indexOf("filename="");
    pos = file.indexOf(" ",pos) + 1;
    pos = file.indexOf(" ",pos) + 1;
    pos = file.indexOf(" ",pos) + 1;
    int boundaryLocation = file.indexOf(boundary,pos) - 4;
    //out.println(boundaryLocation);
    //取得文件数据的开始的位置
    int startPos = ((file.substring(0,pos)).getBytes()).length;
    //out.println(startPos);
    //取得文件数据的结束的位置
    int endPos = ((file.substring(0,boundaryLocation)).getBytes()).length;
    //out.println(endPos);
    //检查上载文件是否存在
    File checkFile = new File(fileName);
    if(checkFile.exists()){
    out.println("<p>" + saveFile + "文件已经存在.</p>");
    }
    //检查上载文件的目录是否存在
    File fileDir = new File(rootPath);
    if(!fileDir.exists()){
    fileDir.mkdirs();
    }
    //创建文件的写出类
    fileOut = new FileOutputStream(fileName);
    //保存文件的数据
    fileOut.write(dataBytes,startPos,(endPos - startPos));
    fileOut.close();
    out.println(saveFile + "文件成功上载.</p>");
    }else{
    String content = request.getContentType();
    out.println("<p>上传的数据类型不是multipart/form-data</p>");
    }
    }catch(Exception ex){
    throw new ServletException(ex.getMessage());
    }
    %>
    </body>
    </html>

    运行方法,将这两个JSP文件放在同一路径下,运行UploadExample.jsp即可。

  • 相关阅读:
    tcp流协议产生的粘包问题和解决方案
    使用fork并发处理多个client的请求和对等通信p2p
    最简单的回射客户/服务器程序、time_wait 状态
    C/S程序的一般流程和基本socket函数
    socket概述和字节序、地址转换函数
    IP数据报格式和IP地址路由
    利用ARP和ICMP协议解释ping命令
    TCP/IP协议栈与数据报封装
    从汇编角度来理解linux下多层函数调用堆栈运行状态
    read/write函数与(非)阻塞I/O的概念
  • 原文地址:https://www.cnblogs.com/king-/p/4126490.html
Copyright © 2011-2022 走看看