`

Servlet 实现文件的上传与下载

 
阅读更多
原文地址:http://www.2cto.com/kf/201307/229316.html



这段时间尝试写了一个小web项目,其中涉及到文件上传与下载,虽然网上有很多成熟的框架供使用,但为了学习我还是选择了自己编写相关的代码。当中遇到了很多问题,所以在此这分享完整的上传与下载代码供大家借鉴。

首先是上传的Servlet代码


[java]
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.RandomAccessFile; 
import java.io.UnsupportedEncodingException; 
import java.util.Random; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class UpLoad extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
     
    private static final Random RANDOM = new Random();       
    private String tempFileFolder;  //临时文件存放目录  
    private String fileFolder;  //存文件的目录  
 
     
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        this.doPost(request, response); 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        //step 1 将上传文件流写入到临时文件  
        File tempFile = getTempFile(); 
        writeToTempFile(request.getInputStream(), tempFile); 
         
        //step 2从临时文件中取得上传文件流  
        RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r"); 
         
        //step 3取得文件名称  
        String filename = getFileName(randomFile); 
         
        //step 4检查存放文件的目录在不在  
        checkFold(); 
         
        //step 5保存文件  
        long fileSize = saveFile(randomFile, filename); 
         
        //step 6关闭流对像,删除临时文件  
        randomFile.close(); 
        tempFile.delete(); 
         
    } 
 
    public void init() throws ServletException { 
        //获取项目所在目录  
        String contentPath = getServletContext().getRealPath("/"); 
        this.tempFileFolder = contentPath + "files/_tmp"; 
        this.fileFolder = contentPath+"files/_file"; 
    } 
     
     
    /**
     * 对字符串进行转码
     * @param str
     * @return 转码后的字符串
     */ 
    private String codeString(String str) { 
        String s = str; 
        try { 
            byte[] temp = s.getBytes("ISO-8859-1"); 
            s = new String(temp, "UTF-8"); 
            return s; 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
            return s; 
        } 
    } 
     
    /**
     * 产生临时文件对象
     * 会检查临时目录是否存在,如果不存在将创建目录
     * @return 临时文件对象
     * @throws IOException
     */ 
    private File getTempFile()throws IOException{ 
        File tempFolder = new File(this.tempFileFolder); 
        if (!tempFolder.exists()){ 
            tempFolder.mkdirs(); 
        } 
        String tempFileName = this.tempFileFolder+File.separator+Math.abs(RANDOM.nextInt()); 
        File tempFile = new File(tempFileName); 
        if (!tempFile.exists()){ 
            tempFile.createNewFile(); 
        } 
        return tempFile; 
    } 
     
    /**
     * 将上传的数据流存入临时文件
     * @param fileSourcel 上传流
     * @param tempFile        临时文件
     * @throws IOException
     */ 
    private void writeToTempFile(InputStream fileSourcel,File tempFile)throws IOException{ 
        FileOutputStream outputStream = new FileOutputStream(tempFile); 
        byte b[] = new byte[1000]; 
        int n ; 
        while ((n=fileSourcel.read(b))!=-1){ 
            outputStream.write(b,0,n); 
        } 
        outputStream.close(); 
        fileSourcel.close(); 
    } 
     
    /**
     * 从临时文件流中提取文件名称
     * @param randomFile
     * @return 解析的文件名称
     * @throws IOException
     */ 
    private String getFileName(RandomAccessFile randomFile)throws IOException{ 
        String _line; 
        while((_line=randomFile.readLine())!=null && !_line.contains("form-data; name=\"upload\"")){ 
        } 
        String filePath = _line; 
        String filename = filePath.replace("Content-Disposition: form-data; name=\"upload\"; filename=\"", "").replace("\"",""); 
         
        filename=codeString(filename); 
        randomFile.seek(0); 
        return filename; 
    } 
     
    /**
     * 获取上传文件的开始位置
     * 开始位置会因为from 表单的参数不同而不同
     * 如果from表单只上传文件是从第四行开始
     * 本例from表单还有一个title的input , 所以从第八行开始。每多一个参数就加四行。
     * @param randomFile
     * @return 上传文件的开始位置
     * @throws IOException
     */ 
    private long getFileEnterPosition(RandomAccessFile randomFile)throws IOException{ 
        long  enterPosition = 0; 
        int forth = 1; 
        int n ; 
        while((n=randomFile.readByte())!=-1&&(forth<=8)){ 
            if(n=='\n'){ 
                enterPosition = randomFile.getFilePointer(); 
                forth++; 
            } 
        } 
        return enterPosition; 
    } 
     
    /**
     * 获取上传文件的结束位置
     * 结束位置会因为文件类型不同,而不同
     * 压缩包是倒数第二行后
     * @param randomFile
     * @return 文件的结束位置
     * @throws IOException
     */ 
    private long getFileEndPosition(RandomAccessFile randomFile)throws IOException{ 
        randomFile.seek(randomFile.length()); 
        long endPosition = randomFile.getFilePointer(); 
        int j = 1; 
        while((endPosition>=0)&&(j<=2)){ 
            endPosition--; 
            randomFile.seek(endPosition); 
            if(randomFile.readByte()=='\n'){ 
                j++; 
            } 
        } 
        return endPosition; 
    } 
     
    /**
     * 检查要保存文件的文件夹是否存在
     */ 
    private void checkFold(){ 
        File file = new File(this.fileFolder); 
        if (!file.exists()){ 
            file.mkdirs(); 
        } 
    } 
     
    /**
     * 将临时文件解析后存放到指定的文件存放目录
     * @param randomFile
     * @param forthEnterPosition
     * @param filename
     * @return fileSize
     * @throws IOException
     */ 
    private long saveFile(RandomAccessFile randomFile,String filename)throws IOException{ 
        File saveFile = new File(this.fileFolder,filename); 
        RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw"); 
         
        long forthEnterPosition = getFileEnterPosition(randomFile); 
        long endPosition = getFileEndPosition(randomFile); 
        //从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中  
        randomFile.seek(forthEnterPosition); 
        long startPoint = randomFile.getFilePointer(); 
        while(startPoint<endPosition){ 
            randomAccessFile.write(randomFile.readByte()); 
            startPoint = randomFile.getFilePointer(); 
        } 
        long fileSize = randomAccessFile.length(); 
        randomAccessFile.close(); 
        return fileSize; 
    } 


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UpLoad extends HttpServlet {
private static final long serialVersionUID = 1L;

private static final Random RANDOM = new Random();
private String tempFileFolder; //临时文件存放目录
private String fileFolder; //存文件的目录


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//step 1 将上传文件流写入到临时文件
File tempFile = getTempFile();
writeToTempFile(request.getInputStream(), tempFile);

//step 2从临时文件中取得上传文件流
RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");

//step 3取得文件名称
String filename = getFileName(randomFile);

//step 4检查存放文件的目录在不在
checkFold();

//step 5保存文件
long fileSize = saveFile(randomFile, filename);

//step 6关闭流对像,删除临时文件
randomFile.close();
tempFile.delete();

}

public void init() throws ServletException {
//获取项目所在目录
String contentPath = getServletContext().getRealPath("/");
this.tempFileFolder = contentPath + "files/_tmp";
this.fileFolder = contentPath+"files/_file";
}


/**
* 对字符串进行转码
* @param str
* @return 转码后的字符串
*/
private String codeString(String str) {
String s = str;
try {
byte[] temp = s.getBytes("ISO-8859-1");
s = new String(temp, "UTF-8");
return s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
}

/**
* 产生临时文件对象
* 会检查临时目录是否存在,如果不存在将创建目录
* @return 临时文件对象
* @throws IOException
*/
private File getTempFile()throws IOException{
File tempFolder = new File(this.tempFileFolder);
if (!tempFolder.exists()){
tempFolder.mkdirs();
}
String tempFileName = this.tempFileFolder+File.separator+Math.abs(RANDOM.nextInt());
File tempFile = new File(tempFileName);
if (!tempFile.exists()){
tempFile.createNewFile();
}
return tempFile;
}

/**
* 将上传的数据流存入临时文件
* @param fileSourcel 上传流
* @param tempFile       临时文件
* @throws IOException
*/
private void writeToTempFile(InputStream fileSourcel,File tempFile)throws IOException{
FileOutputStream outputStream = new FileOutputStream(tempFile);
byte b[] = new byte[1000];
int n ;
while ((n=fileSourcel.read(b))!=-1){
   outputStream.write(b,0,n);
}
outputStream.close();
fileSourcel.close();
}

/**
* 从临时文件流中提取文件名称
* @param randomFile
* @return 解析的文件名称
* @throws IOException
*/
private String getFileName(RandomAccessFile randomFile)throws IOException{
String _line;
while((_line=randomFile.readLine())!=null && !_line.contains("form-data; name=\"upload\"")){
}
String filePath = _line;
String filename = filePath.replace("Content-Disposition: form-data; name=\"upload\"; filename=\"", "").replace("\"","");

filename=codeString(filename);
randomFile.seek(0);
return filename;
}

/**
* 获取上传文件的开始位置
* 开始位置会因为from 表单的参数不同而不同
* 如果from表单只上传文件是从第四行开始
* 本例from表单还有一个title的input , 所以从第八行开始。每多一个参数就加四行。
* @param randomFile
* @return 上传文件的开始位置
* @throws IOException
*/
private long getFileEnterPosition(RandomAccessFile randomFile)throws IOException{
long  enterPosition = 0;
int forth = 1;
int n ;
while((n=randomFile.readByte())!=-1&&(forth<=8)){
   if(n=='\n'){
    enterPosition = randomFile.getFilePointer();
       forth++;
   }
}
return enterPosition;
}

/**
* 获取上传文件的结束位置
* 结束位置会因为文件类型不同,而不同
* 压缩包是倒数第二行后
* @param randomFile
* @return 文件的结束位置
* @throws IOException
*/
private long getFileEndPosition(RandomAccessFile randomFile)throws IOException{
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while((endPosition>=0)&&(j<=2)){
   endPosition--;
   randomFile.seek(endPosition);
   if(randomFile.readByte()=='\n'){
       j++;
   }
}
return endPosition;
}

/**
* 检查要保存文件的文件夹是否存在
*/
private void checkFold(){
File file = new File(this.fileFolder);
if (!file.exists()){
file.mkdirs();
}
}

/**
* 将临时文件解析后存放到指定的文件存放目录
* @param randomFile
* @param forthEnterPosition
* @param filename
* @return fileSize
* @throws IOException
*/
private long saveFile(RandomAccessFile randomFile,String filename)throws IOException{
File saveFile = new File(this.fileFolder,filename);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");

long forthEnterPosition = getFileEnterPosition(randomFile);
long endPosition = getFileEndPosition(randomFile);
//从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
randomFile.seek(forthEnterPosition);
long startPoint = randomFile.getFilePointer();
while(startPoint<endPosition){
   randomAccessFile.write(randomFile.readByte());
   startPoint = randomFile.getFilePointer();
}
long fileSize = randomAccessFile.length();
randomAccessFile.close();
return fileSize;
}
}

接着是下载的Servlet代码


[java]
mport java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.URLEncoder; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class Download extends HttpServlet { 
 
    private static final long serialVersionUID = 1L; 
    private static final String FILEDIR="files/_file"; 
    private String fileFolder;  //存文件的目录  
     
    public Download() { 
        super(); 
    } 
 
     
    public void destroy() { 
        super.destroy();  
        // Put your code here  
    } 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
            this.doPost(request, response); 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
//      request.setCharacterEncoding("UTF-8");  
        try{ 
            String fileName = request.getParameter("name"); 
            OutputStream outputStream = response.getOutputStream(); 
            //输出文件用的字节数组,每次向输出流发送600个字节  
            byte b[] = new byte[600]; 
             
            File fileload = new File(this.fileFolder,fileName); 
             
            fileName=encodeFileName(request,fileName); 
            //客服端使用保存文件的对话框  
            response.setHeader("Content-disposition", "attachment;filename="+fileName); 
            //通知客户文件的长度  
            long fileLength = fileload.length(); 
            String length = String.valueOf(fileLength); 
            response.setHeader("Content_length", length); 
            //读取文件,并发送给客服端下载  
            FileInputStream inputStream = new FileInputStream(fileload); 
            int n = 0; 
            while((n=inputStream.read(b))!=-1){ 
                outputStream.write(b,0,n); 
            } 
        }catch(FileNotFoundException fnfe){ 
            fnfe.printStackTrace(); 
            try{ 
                PrintWriter out = response.getWriter(); 
                out.println("下载的文件不存在"); 
                out.flush(); 
                out.close(); 
            }catch(IOException ie){ 
                ie.printStackTrace(); 
            } 
        }catch(IOException ie){ 
            ie.printStackTrace(); 
            try{ 
                PrintWriter out = response.getWriter(); 
                out.println("下载存在问题"); 
                out.flush(); 
                out.close(); 
            }catch(IOException iex){ 
                iex.printStackTrace(); 
            } 
        } 
    } 
 
    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */ 
    public void init() throws ServletException { 
        this.fileFolder = getServletContext().getRealPath("/")+"files/_file"; 
    } 
     
    private String encodeFileName(HttpServletRequest request,String fileName){ 
        try{ 
            //IE  
            if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") >0){ 
                fileName=URLEncoder.encode(fileName,"UTF-8"); 
            }else{ 
                fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1"); 
            } 
        }catch(Exception ex){ 
            ex.printStackTrace(); 
        } 
        return fileName; 
    } 
     


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Download extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final String FILEDIR="files/_file";
private String fileFolder; //存文件的目录

public Download() {
super();
}


public void destroy() {
super.destroy();
// Put your code here
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
try{
String fileName = request.getParameter("name");
OutputStream outputStream = response.getOutputStream();
//输出文件用的字节数组,每次向输出流发送600个字节
byte b[] = new byte[600];

File fileload = new File(this.fileFolder,fileName);

fileName=encodeFileName(request,fileName);
//客服端使用保存文件的对话框
response.setHeader("Content-disposition", "attachment;filename="+fileName);
//通知客户文件的长度
long fileLength = fileload.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_length", length);
//读取文件,并发送给客服端下载
FileInputStream inputStream = new FileInputStream(fileload);
int n = 0;
while((n=inputStream.read(b))!=-1){
   outputStream.write(b,0,n);
}
}catch(FileNotFoundException fnfe){
fnfe.printStackTrace();
try{
PrintWriter out = response.getWriter();
out.println("下载的文件不存在");
out.flush();
out.close();
}catch(IOException ie){
ie.printStackTrace();
}
}catch(IOException ie){
ie.printStackTrace();
try{
PrintWriter out = response.getWriter();
out.println("下载存在问题");
out.flush();
out.close();
}catch(IOException iex){
iex.printStackTrace();
}
}
}

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
this.fileFolder = getServletContext().getRealPath("/")+"files/_file";
}

private String encodeFileName(HttpServletRequest request,String fileName){
try{
//IE
if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") >0){
fileName=URLEncoder.encode(fileName,"UTF-8");
}else{
fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
}
}catch(Exception ex){
ex.printStackTrace();
}
return fileName;
}

}



[java]
<PRE class=java name="code" sizcache="1" sizset="4"><PRE></PRE> 
<PRE></PRE> 
<PRE></PRE> 
<PRE></PRE> 
 
</PRE> 

[java]
<PRE></PRE>  <PRE></PRE>  <PRE></PRE>  <PRE></PRE> 
分享到:
评论

相关推荐

    Servlet实现文件上传与下载

    ### Servlet实现文件上传与下载 #### 一、概述 在Web开发中,文件的上传与下载是一项非常常见的功能需求。本文将详细介绍如何使用Java Servlet技术实现文件的上传和下载功能。我们将通过一个简单的示例来展示整个...

    jsp+servlet实现文件上传与下载功能.docx

    本教程将介绍如何使用它们来实现文件上传和下载的功能。文件上传和下载是许多Web应用的基本需求,例如用户可以在网站上上传图片、文档等,或者下载服务器上的资源。 首先,要实现文件上传,我们需要引入Apache ...

    JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...

    servlet 文件上传下载例子

    在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...

    jsp+servlet实现文件上传下载

    ### jsp+servlet实现文件上传下载 在现代Web开发中,文件上传下载是常见的功能之一。JSP(JavaServer Pages)与Servlet技术结合可以轻松实现这一功能。本篇将详细介绍如何利用jspSmartUpload组件实现文件的上传与...

    servlet实现文件上传下载

    本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,其中涉及到的主要技术点包括Servlet API、Multipart解析以及文件流操作。 首先,我们需要了解Servlet在文件上传中的作用。Servlet在接收到客户端(通常...

    servlet实现文件上传功能

    在本篇讨论中,我们将深入探讨如何利用Servlet实现文件上传功能,以及在这个过程中涉及的关键知识点。 首先,我们需要了解HTTP协议。HTTP协议是无状态的,这意味着每次请求都是独立的。因此,在客户端(通常是...

    CKEditor 上传文件(Servlet实现)

    通过以上步骤,你可以成功地在CKEditor 3.6.0中集成Servlet实现的文件上传功能。这个过程不仅适用于图片,还可以扩展到其他类型的文件,如文档、音频和视频。注意在实际应用中,根据服务器环境和项目需求进行相应的...

    使用Servlet实现文件的上传与下载

    本教程将详细讲解如何使用Servlet实现文件的上传和下载功能,这对于任何Web应用程序来说都是至关重要的。 首先,我们来了解一下Servlet的基本概念。Servlet是Java编程语言中一个用于扩展服务器功能的接口,主要应用...

    基于Servlet实现文件的上传与下载

    "基于Servlet实现文件的上传与下载"是一个常见的实战任务,它涵盖了网络编程、多线程和文件I/O等多个核心概念。这里我们将深入探讨如何利用Servlet来实现这两个功能。 首先,让我们了解Servlet的工作原理。Servlet...

    jsp+servlet实现文件上传和下载

    在这个主题中,“jsp+servlet实现文件上传和下载”是核心知识点,我们将深入探讨如何利用这两个组件以及Apache的`commons-fileupload`和`commons-io`库来完成这一任务。 1. **文件上传** 文件上传通常涉及用户通过...

    文件上传与下载servlet

    下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...

    【Demo Project】ajaxSubmit+Servlet表单文件上传和下载

    【AjaxSubmit+Servlet实现表单文件上传与下载详解】 在Web开发中,文件上传和下载是常见的功能,尤其是在用户交互丰富的应用中。本项目【Demo Project】利用AjaxSubmit结合Servlet技术,提供了一种高效、异步的方式...

    Servlet中文件上传和下载

    本文将深入探讨如何在Servlet中实现文件的上传和下载功能,以及在页面上利用JSP和Javabean来实例化对象。 首先,文件上传是通过HTTP多部分请求(Multipart Request)来实现的。Servlet 3.0及以上版本提供了对这种...

    jsp+servlet实现文件上传与下载功能

    本文实例为大家分享了jsp servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 上传: 需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar import java.io.File; import java.io....

    servlet实现的上传文件实例

    综上所述,Servlet实现的文件上传涉及了HTTP协议、Servlet API、文件存储策略、安全控制等多个方面。理解并熟练掌握这些知识点,对于开发高效且安全的文件上传功能至关重要。在实际项目中,我们还需要考虑并发处理、...

    java servlet实现图片上传下载

    总结起来,"Java Servlet实现图片上传下载"涉及到的主要知识点有:Servlet生命周期、HTTP协议、文件I/O、数据库操作、表单提交处理、文件存储策略、安全控制、响应头设置以及异常处理。掌握这些技能,开发者可以构建...

    servlet实现多文件上传

    本篇文章将深入探讨如何使用Servlet实现多文件上传的功能。多文件上传是Web应用中常见的一种需求,例如用户可能需要上传一组图片、文档或其他类型的数据。Servlet提供了一种灵活的方式来处理这种需求。 首先,我们...

    Servlet文件上传、下载及缩略图的生成

    在这个项目中,我们重点关注的是Servlet如何实现文件上传、下载和缩略图的生成。 首先,让我们深入理解文件上传的过程。在Web应用中,文件上传通常通过HTML表单实现,使用`&lt;input type="file" /&gt;`标签让用户选择要...

    用servlet写的文件上传及下载功能带进度条

    com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 com.fm.MyPreogressListener:一个进度监听类,用来做上传进度条的 jquery-1.9.1.js index.jsp:文件列表页面 upload.jsp:文件上传form...

Global site tag (gtag.js) - Google Analytics