精华内容
下载资源
问答
  • 支持大文件批量上传(20G)和下载同时需要保证上传期间用户电脑不出现卡死等体验; 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。 支持...

    需求:

    支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验;

    内网百兆网络上传速度为12MB/S

    服务器内存占用低

    支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。

    支持PC端全平台操作系统,Windows,Linux,Mac

    支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。

    支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同。

    支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留进度。

    支持文件夹结构管理,支持新建文件夹,支持文件夹目录导航

    交互友好,能够及时反馈上传的进度;

    服务端的安全性,不因上传文件功能导致JVM内存溢出影响其他功能使用;

    最大限度利用网络上行带宽,提高上传速度;

     

    分析:

    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传

    从上传的效率来看,利用多线程并发上传能够达到最大效率。

     

    解决方案:

    文件上传页面的前端可以选择使用一些比较好用的上传组件,例如百度的开源组件WebUploader,泽优软件的up6,这些组件基本能满足文件上传的一些日常所需功能,如异步上传文件,文件夹,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,甚至是大文件断点续传,大文件秒传。

     

     

    第一步:

    数据库配置

    项目中数据库配置是在DBConfig.java文件中,只需要在此文件中进行数据库配置即可。

    在DBConfig.java文件提供了mysql,SQL Server,Oracle的配置信息,只需要填写对应的数据库配置即可。如果使用的MYSQL就填MySQL数据库的连接信息,如果使用的是Oracle就填写Oracle数据库的连接信息

    upload:{uploadLimit:5,fileSizeLimit:31744,removeTimeout:0.8}

    以上三个变量代表的含义是:

    uploadLimit:表示上传文件个数的限制,5表示文件上传个数限制是5个

    fileSizeLimit:表示上传文件大小的限制,31744单位是KB,也就是表示31M

    removeTimeout:表示移除文件的时间限制

    继续查找使用到这些变量的地方,看到了文件大小超出限制等
    文件大小配置,如果需要限制用户选择的文件大小,则在up6.js中对FileSizeLimit进行配置即可,单位是字节。

    了解了BJUI前端框架对于上传大文件的限制,可以这样使用,增大文件上传大小和数量,可以按照如下进行修改,我们在bjui-all.js文件看到uploadLimit属性和fileSizeLimit属性的限制,我们在jsp文件中可以这样进行替换,这里使用的是覆盖原则,重新定义uploadLimit属性和fileSizeLimit属性,覆盖bjui-all.js文件的默认值设置。

     

    bjui-all.js文件的uploadLimit属性和fileSizeLimit属性对应到jsp文件中的属性就应该这样写,data-upload-limit属性和data-file-size-limit属性,只需要在后面改写为data-upload-limit=“800”和data-file-size-limit=“5131264”即可,一定要注意这里的单位是KB,以上数字表示501M。

     

    关于Uploadify控件属性可以参考这篇文章也可以直接看官网文档:

    https://www.cnblogs.com/yangy608/p/3915349.html

    属性名称

    默认值

    说明

    auto

    true

    设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。

    buttonClass

    按钮样式

    buttonCursor

    ‘hand’

    鼠标指针悬停在按钮上的样子

    buttonImage

    null

    浏览按钮的图片的路径 。

    buttonText

    ‘SELECT FILES’

    浏览按钮的文本。

    checkExisting

    false

    文件上传重复性检查程序,检查即将上传的文件在服务器端是否已存在,存在返回1,不存在返回0

    debug

    false

    如果设置为true则表示启用SWFUpload的调试模式

    fileObjName

    ‘Filedata’

    文件上传对象的名称,如果命名为’the_files’,PHP程序可以用$_FILES['the_files']来处理上传的文件对象。

    fileSizeLimit

    0

    上传文件的大小限制 ,如果为整数型则表示以KB为单位的大小,如果是字符串,则可以使用(B, KB, MB, or GB)为单位,比如’2MB’;

    如果设置为0则表示无限制

    fileTypeDesc

    ‘All Files’

    这个属性值必须设置fileTypeExts属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileTypeDesc为“请选择rar   doc pdf文件”

    fileTypeExts

    ‘*.*’

    设置可以选择的文件的类型,格式如:’*.doc;*.pdf;*.rar’ 。

    formData

     

    JSON格式上传每个文件的同时提交到服务器的额外数据,可在’onUploadStart’事件中使用’settings’方法动态设置。

    height

    30

    设置浏览按钮的高度 ,默认值

    itemTemplate

    false

    用于设置上传队列的HTML模版,可以使用以下标签:
      instanceID – Uploadify实例的ID
      fileID – 列队中此文件的ID,或者理解为此任务的ID
      fileName – 文件的名称
      fileSize – 当前上传文件的大小
      插入模版标签时使用格式如:${fileName}

    method

    Post

    提交方式Post或Get

    multi

    true

    设置为true时可以上传多个文件。

    overrideEvents

     

    设置哪些事件可以被重写,JSON格式,如:’overrideEvents’ : ['onUploadProgress']

    preventCaching

    true

    如果为true,则每次上传文件时自动加上一串随机字符串参数,防止URL缓存影响上传结果

    progressData

    ‘percentage’

    设置上传进度显示方式,percentage显示上传百分比,speed显示上传速度

    queueID

    false

    设置上传队列容器DOM元素的ID,如果为false则自动生成一个队列容器。

    queueSizeLimit

    999

    队列最多显示的任务数量,如果选择的文件数量超出此限制,将会出发onSelectError事件。
      注意此项并非最大文件上传数量,如果要限制最大上传文件数量,应设置uploadLimit。

    removeCompleted

    true

    是否自动将已完成任务从队列中删除,如果设置为false则会一直保留此任务显示。

    removeTimeout

    3

    如果设置了任务完成后自动从队列中移除,则可以规定从完成到被移除的时间间隔。

    requeueErrors

    false

    如果设置为true,则单个任务上传失败后将返回错误,并重新加入任务队列上传。

    successTimeout

    30

    文件上传成功后服务端应返回成功标志,此项设置返回结果的超时时间

    swf

    ‘uploadify.swf’

    uploadify.swf 文件的相对路径。

    uploader

    uploadify.php

    后台处理程序的相对路径。

    uploadLimit

    999

    最大上传文件数量,如果达到或超出此限制将会触发onUploadError事件。

    width

    120

    设置文件浏览按钮的宽度。

    第二步:

    后端修改
    项目采用的最简单的jsp文件,修改起来非常简单。现在提供的DEMO基本上不需要进行其它的修改。只需要对地址进行简单配置就可以立即使用。


    项目的依赖包全部都放在项目的lib目录中,可以直接导入。相关的IDE都能够自动导入,也是非常的简单。

    由于项目后端使用的Spring Boot,本身也就是使用的Spring MVC文件上传部分,Spring MVC使用的是已经对Servlet文件上传封装了的MultipartResolver接口及其相关实现类和一些相关的类,具体的可以看Spring MVC文件上传源码部分,认为Spring源码还是需要读的,我们只要在Spring Boot启动类中注入这个Bean,或者自行写一个WebConfig配置类,注入一些Web相关的Bean即可,这样Spring Boot启动就会加载配置类,也需要自己写拦截器和全局AOP切面,去捕捉文件上传大小超过限制的异常处理等

     

    基于Spring MVC文件上传组件MultipartResolver接口(核心),使用其中的CommonsMultipartResolver(实现了MultipartResolver接口)这个实现类,CommonsMultipartResolver中的maxUploadSize属性是它继承的抽象父类CommonsFileUploadSupport,这个抽象类其中的一个属性是FileUpload类,而这个类又继承自FileUploadBase这个抽象类,其中它的private long sizeMax = -1;就是maxUploadSize属性的最终设置地方。-1表示文件上传大小没有限制,但是我们一般都会设置一个限制值,这里设置的是210763776,这个值的单位是字节,我们将它设置为525336576字节,也就是501M的大小限制。

     

    修改完以上前端和后端,提交修改的代码到git上即可。

     

    第三步:

    Nginx配置

    进入到项目部署发布所在的Linux下,进入nginx服务器所安装的目录,

    进入到nginx服务器所安装的目录

    进入到nginx服务器目录下的conf目录

     

    查看nginx.conf配置文件内容中的client_max_body_size配置的大小,这里设置的是300M。

     

    使用vi或者vim打开nginx.conf配置文件,修改client_max_body_size的大小为501M,保存即可

     

    进入到nginx服务器下的sbin目录下,我们使用./nginx -t查看配置文件是否成功使用,然后使用./nginx -s reload重启Nginx服务器即可。

     

     

    第四步:

    Tomcat配置

    由于项目使用的是Spring Cloud,自然使用Spring Boot,我们这个项目还是使用外置的Tomcat作为他的服务器,便于我们对Tomcat服务器进行优化和设置。

    进入到项目使用的Tomcat服务器的目录

     

    进入到指定项目使用的Tomcat服务器的目录

     

    进入到Tomcat服务器下的conf配置目录中

     

    看到server.xml配置文件后

     

    先行查看Tomcat服务器的配置,其中两个属性对于这次是比较重要的一个是connectionTimeout这个连接超时时间设置以及默认的maxPostSize属性的设置

     

    使用vi或者vim打开server.xml配置文件,修改connectionTimeout的大小为2000000,这个属性的单位是毫秒,换算之后大概是半个小时,我们配置缺省的maxPostSize属性的值,默认情况下它的值是2097152,它的单位是字节,也就是2M的大小,修改完保存即可

     

     

    修改完服务器之后,使用发布工具重新从git上拉取最新的代码和部署发布,重新启动脚本即可完成修改,再次尝试大文件上传,功能基本实现。

     

    以上需要注意的是maxPostSize属性在各个Tomcat版本中的不同,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/09/18/%E4%B8%8A%E4%BC%A0%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/

    欢迎入群一起讨论:374992201

    展开全文
  • 文件上传一直是Web项目中必不可少的一项功能。项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传下载)主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml1.先编写up.jsp...

    文件上传一直是Web项目中必不可少的一项功能。

    项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)

    a099a326f42ba63669fe70d83ff1eebd.png

    主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml

    1.先编写up.jsp

    上传者:

    选择文件:

    选择文件:

    以上便是up.jsp的核心代码;

    2.编写doupload.jsp

    request.setCharacterEncoding("utf-8");

    String uploadFileName = ""; //上传的文件名

    String fieldName = ""; //表单字段元素的name属性值

    //请求信息中的内容是否是multipart类型

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    //上传文件的存储路径(服务器文件系统上的绝对文件路径)

    String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );

    if (isMultipart) {

    FileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    try {

    //解析form表单中所有文件

    List items = upload.parseRequest(request);

    Iterator iter = items.iterator();

    while (iter.hasNext()) { //依次处理每个文件

    FileItem item = (FileItem) iter.next();

    if (item.isFormField()){ //普通表单字段

    fieldName = item.getFieldName(); //表单字段的name属性值

    if (fieldName.equals("user")){

    //输出表单字段的值

    out.print(item.getString("UTF-8")+"上传了文件。
    ");

    }

    }else{ //文件表单字段

    String fileName = item.getName();

    if (fileName != null && !fileName.equals("")) {

    File fullFile = new File(item.getName());

    File saveFile = new File(uploadFilePath, fullFile.getName());

    item.write(saveFile);

    uploadFileName = fullFile.getName();

    out.print("上传成功后的文件名是:"+uploadFileName);

    out.print("\t\t下载链接:"+""+uploadFileName+"");

    out.print("
    ");

    }

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    %>

    该页面主要是内容是,通过解析request,并设置上传路径,创建一个迭代器,先进行判空,再通过循环来实现多个文件的上传,再输出文件信息的同时打印文件下载路径。

    效果图:

    c0f0fc6d329572745e4d3504af8169dc.png

    ad117486b6bbdfb7ba88e58ebff190ed.png

    3.编写FilterController实现文件下载的功能(相对上传比较简单):

    @Controller

    public class FileUploadController {

    @RequestMapping(value="/download")

    public ResponseEntity download(HttpServletRequest request,HttpServletResponse response,@RequestParam("name") String filename)throws Exception {

    //下载显示的文件名,解决中文名称乱码问题

    filename=new String(filename.getBytes("iso-8859-1"),"UTF-8");

    //下载文件路径

    String path = request.getServletContext().getRealPath("/upload/");

    File file = new File(path + File.separator + filename);

    HttpHeaders headers = new HttpHeaders();

    //下载显示的文件名,解决中文名称乱码问题

    String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");

    //通知浏览器以attachment(下载方式)打开图片

    headers.setContentDispositionFormData("Content-Disposition", downloadFielName);

    //application/octet-stream : 二进制流数据(最常见的文件下载)。

    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    return new ResponseEntity(FileUtils.readFileToByteArray(file),

    headers, HttpStatus.CREATED);

    }

    }

    4.实现上传文件的功能还需要在springmvc中配置bean:

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    10485760

    UTF-8

    完整代码如下:

    up.jsp

    File控件

    上传者:

    选择文件:

    选择文件:

    doupload.jsp

    上传处理页面

    request.setCharacterEncoding("utf-8");

    String uploadFileName = ""; //上传的文件名

    String fieldName = ""; //表单字段元素的name属性值

    //请求信息中的内容是否是multipart类型

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    //上传文件的存储路径(服务器文件系统上的绝对文件路径)

    String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );

    if (isMultipart) {

    FileItemFactory factory = new DiskFileItemFactory();

    ServletFileUpload upload = new ServletFileUpload(factory);

    try {

    //解析form表单中所有文件

    List items = upload.parseRequest(request);

    Iterator iter = items.iterator();

    while (iter.hasNext()) { //依次处理每个文件

    FileItem item = (FileItem) iter.next();

    if (item.isFormField()){ //普通表单字段

    fieldName = item.getFieldName(); //表单字段的name属性值

    if (fieldName.equals("user")){

    //输出表单字段的值

    out.print(item.getString("UTF-8")+"上传了文件。
    ");

    }

    }else{ //文件表单字段

    String fileName = item.getName();

    if (fileName != null && !fileName.equals("")) {

    File fullFile = new File(item.getName());

    File saveFile = new File(uploadFilePath, fullFile.getName());

    item.write(saveFile);

    uploadFileName = fullFile.getName();

    out.print("上传成功后的文件名是:"+uploadFileName);

    out.print("\t\t下载链接:"+""+uploadFileName+"");

    out.print("
    ");

    }

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    %>

    FileUploadController.java

    package ssm.me.controller;

    import java.io.File;

    import java.net.URLDecoder;

    import java.util.Iterator;

    import java.util.List;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.fileupload.FileItem;

    import org.apache.commons.fileupload.FileItemFactory;

    import org.apache.commons.fileupload.disk.DiskFileItemFactory;

    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    import org.apache.commons.io.FileUtils;

    import org.junit.runners.Parameterized.Parameter;

    import org.springframework.http.HttpHeaders;

    import org.springframework.http.HttpStatus;

    import org.springframework.http.MediaType;

    import org.springframework.http.ResponseEntity;

    import org.springframework.stereotype.Controller;

    import org.springframework.ui.Model;

    import org.springframework.web.bind.annotation.ModelAttribute;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import org.springframework.web.bind.annotation.RequestParam;

    import org.springframework.web.multipart.MultipartFile;

    @Controller

    public class FileUploadController {

    @RequestMapping(value="/download")

    public ResponseEntity download(HttpServletRequest request,HttpServletResponse response,@RequestParam("name") String filename)throws Exception {

    //下载显示的文件名,解决中文名称乱码问题

    filename=new String(filename.getBytes("iso-8859-1"),"UTF-8");

    //下载文件路径

    String path = request.getServletContext().getRealPath("/upload/");

    File file = new File(path + File.separator + filename);

    HttpHeaders headers = new HttpHeaders();

    //下载显示的文件名,解决中文名称乱码问题

    String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");

    //通知浏览器以attachment(下载方式)打开图片

    headers.setContentDispositionFormData("Content-Disposition", downloadFielName);

    //application/octet-stream : 二进制流数据(最常见的文件下载)。

    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    return new ResponseEntity(FileUtils.readFileToByteArray(file),

    headers, HttpStatus.CREATED);

    }

    }

    SpringMVC.xml(仅供参考,有的地方不可以照搬)

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

    http://www.springframework.org/schema/mvc

    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context.xsd

    http://www.springframework.org/schema/aop

    http://www.springframework.org/schema/aop/spring-aop-4.2.xsd

    http://www.springframework.org/schema/tx

    http://www.springframework.org/schema/tx/spring-tx.xsd">

    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    10485760

    UTF-8

    web.xml(仅供参考,有的地方不可以照搬)

    Student

    index.html

    index.htm

    index.jsp

    default.html

    default.htm

    default.jsp

    springmvc

    org.springframework.web.servlet.DispatcherServlet

    contextConfigLocation

    classpath:springmvc.xml

    1

    springmvc

    *.action

    contextConfigLocation

    classpath:spring/applicationContext-*.xml

    org.springframework.web.context.ContextLoaderListener

    以上便为文件上传和下载的全部代码,博主亲测过,没有问题。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • Java实现上传(支持多个文件同时上传)和下载

    万次阅读 多人点赞 2018-05-08 17:38:41
    文件上传一直是Web项目中必不可少的一项功能。项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传下载)主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml1.先编写up.jsp&...

    文件上传一直是Web项目中必不可少的一项功能。

    项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)


    主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml

    1.先编写up.jsp

    <form action="doupload.jsp" enctype="multipart/form-data" method="post">
       		<p>上传者:<input type="text" name="user"></p> 
       		<p>选择文件:<input type="file" name="nfile"></p> 
       		<p>选择文件:<input type="file" name="nfile1"></p> 
       		<p><input type="submit" value="提交"></p>
       </form>

    以上便是up.jsp的核心代码;

    2.编写doupload.jsp

    <%
    	request.setCharacterEncoding("utf-8");
    	String uploadFileName = ""; //上传的文件名
    	String fieldName = "";  //表单字段元素的name属性值
    	//请求信息中的内容是否是multipart类型
    	boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    	//上传文件的存储路径(服务器文件系统上的绝对文件路径)
    	String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );
    	if (isMultipart) {
    		FileItemFactory factory = new DiskFileItemFactory();
    		ServletFileUpload upload = new ServletFileUpload(factory);
    		try {
    			//解析form表单中所有文件
    			List<FileItem> items = upload.parseRequest(request);
    			Iterator<FileItem> iter = items.iterator();
    			while (iter.hasNext()) {   //依次处理每个文件
    				FileItem item = (FileItem) iter.next();
    				if (item.isFormField()){  //普通表单字段
    					fieldName = item.getFieldName();   //表单字段的name属性值
    					if (fieldName.equals("user")){
    						//输出表单字段的值
    						out.print(item.getString("UTF-8")+"上传了文件。<br/>");
    					}
    				}else{  //文件表单字段
    					String fileName = item.getName();
    					if (fileName != null && !fileName.equals("")) {
    						File fullFile = new File(item.getName());
    						File saveFile = new File(uploadFilePath, fullFile.getName());
    						item.write(saveFile);
    						uploadFileName = fullFile.getName();
    						out.print("上传成功后的文件名是:"+uploadFileName);	
    						out.print("\t\t下载链接:"+"<a href='download.action?name="+uploadFileName+"'>"+uploadFileName+"</a>");
    						out.print("<br/>");	
    					}
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    %>

    该页面主要是内容是,通过解析request,并设置上传路径,创建一个迭代器,先进行判空,再通过循环来实现多个文件的上传,再输出文件信息的同时打印文件下载路径。

    效果图:



    3.编写FilterController实现文件下载的功能(相对上传比较简单):

    @Controller
    public class FileUploadController {
    	@RequestMapping(value="/download")
    	public ResponseEntity<byte[]> download(HttpServletRequest request,HttpServletResponse response,@RequestParam("name") String filename)throws Exception {    
    		//下载显示的文件名,解决中文名称乱码问题  
    		filename=new String(filename.getBytes("iso-8859-1"),"UTF-8");
    		//下载文件路径
    		String path = request.getServletContext().getRealPath("/upload/");
    		File file = new File(path + File.separator + filename);
    		HttpHeaders headers = new HttpHeaders();  
    		//下载显示的文件名,解决中文名称乱码问题  
    		String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");
    		//通知浏览器以attachment(下载方式)打开图片
    		headers.setContentDispositionFormData("Content-Disposition", downloadFielName); 
    		//application/octet-stream : 二进制流数据(最常见的文件下载)。
    		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
    				headers, HttpStatus.CREATED);  
    	}
    }

    4.实现上传文件的功能还需要在springmvc中配置bean:

    <bean id="multipartResolver"  
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
            <!-- 上传文件大小上限,单位为字节(10MB) -->
            <property name="maxUploadSize">  
                <value>10485760</value>  
            </property>  
            <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
            <property name="defaultEncoding">
                <value>UTF-8</value>
            </property>
        </bean>

    完整代码如下:

    up.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>File控件</title>
      </head>
      
      <body>
       <form action="doupload.jsp" enctype="multipart/form-data" method="post">
       		<p>上传者:<input type="text" name="user"></p> 
       		<p>选择文件:<input type="file" name="nfile"></p> 
       		<p>选择文件:<input type="file" name="nfile1"></p> 
       		<p><input type="submit" value="提交"></p>
       </form>
      </body>
    </html>

    doupload.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@page import="java.io.*,java.util.*"%>
    <%@page import="org.apache.commons.fileupload.*"%>
    <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
    <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>上传处理页面</title>
    </head>
    <body>
    <%
    	request.setCharacterEncoding("utf-8");
    	String uploadFileName = ""; //上传的文件名
    	String fieldName = "";  //表单字段元素的name属性值
    	//请求信息中的内容是否是multipart类型
    	boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    	//上传文件的存储路径(服务器文件系统上的绝对文件路径)
    	String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );
    	if (isMultipart) {
    		FileItemFactory factory = new DiskFileItemFactory();
    		ServletFileUpload upload = new ServletFileUpload(factory);
    		try {
    			//解析form表单中所有文件
    			List<FileItem> items = upload.parseRequest(request);
    			Iterator<FileItem> iter = items.iterator();
    			while (iter.hasNext()) {   //依次处理每个文件
    				FileItem item = (FileItem) iter.next();
    				if (item.isFormField()){  //普通表单字段
    					fieldName = item.getFieldName();   //表单字段的name属性值
    					if (fieldName.equals("user")){
    						//输出表单字段的值
    						out.print(item.getString("UTF-8")+"上传了文件。<br/>");
    					}
    				}else{  //文件表单字段
    					String fileName = item.getName();
    					if (fileName != null && !fileName.equals("")) {
    						File fullFile = new File(item.getName());
    						File saveFile = new File(uploadFilePath, fullFile.getName());
    						item.write(saveFile);
    						uploadFileName = fullFile.getName();
    						out.print("上传成功后的文件名是:"+uploadFileName);	
    						out.print("\t\t下载链接:"+"<a href='download.action?name="+uploadFileName+"'>"+uploadFileName+"</a>");
    						out.print("<br/>");	
    					}
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    %>
    </body>
    </html>

    FileUploadController.java

    package ssm.me.controller;
    
    import java.io.File;
    import java.net.URLDecoder;
    import java.util.Iterator;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FileUtils;
    import org.junit.runners.Parameterized.Parameter;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    
    
    @Controller
    public class FileUploadController {
    	@RequestMapping(value="/download")
    	public ResponseEntity<byte[]> download(HttpServletRequest request,HttpServletResponse response,@RequestParam("name") String filename)throws Exception {    
    		//下载显示的文件名,解决中文名称乱码问题  
    		filename=new String(filename.getBytes("iso-8859-1"),"UTF-8");
    		//下载文件路径
    		String path = request.getServletContext().getRealPath("/upload/");
    		File file = new File(path + File.separator + filename);
    		HttpHeaders headers = new HttpHeaders();  
    		//下载显示的文件名,解决中文名称乱码问题  
    		String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");
    		//通知浏览器以attachment(下载方式)打开图片
    		headers.setContentDispositionFormData("Content-Disposition", downloadFielName); 
    		//application/octet-stream : 二进制流数据(最常见的文件下载)。
    		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
    				headers, HttpStatus.CREATED);  
    	}
    }

    SpringMVC.xml(仅供参考,有的地方不可以照搬)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop" 
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd 
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd">
            <!-- 一个用于自动配置注解的注解配置 -->
            <mvc:annotation-driven></mvc:annotation-driven>
         	<!-- 扫描该包下面所有的Controller -->
         	<context:component-scan base-package="ssm.me.controller"></context:component-scan>
            <!-- 视图解析器 -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
    		<bean id="multipartResolver"  
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
            <!-- 上传文件大小上限,单位为字节(10MB) -->
            <property name="maxUploadSize">  
                <value>10485760</value>  
            </property>  
            <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
            <property name="defaultEncoding">
                <value>UTF-8</value>
            </property>
        </bean>
    
    </beans>        

    web.xml(仅供参考,有的地方不可以照搬)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>Student</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
     <servlet>
      	<servlet-name>springmvc</servlet-name>
      	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 初始化参数 -->
      <init-param>
      	<param-name>contextConfigLocation</param-name>
      	<param-value>classpath:springmvc.xml</param-value>
      </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
     	<servlet-name>springmvc</servlet-name>
     	<url-pattern>*.action</url-pattern>
     </servlet-mapping>
      <context-param>
     		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:spring/applicationContext-*.xml</param-value>
     </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    </web-app>

    以上变为文件上传和下载的全部代码,博主亲测过,没有问题。

    展开全文
  • 支持大文件批量上传(20G)和下载同时需要保证上传期间用户电脑不出现卡死等体验; 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。 支持...

    需求:

    支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验;

    内网百兆网络上传速度为12MB/S

    服务器内存占用低

    支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。

    支持PC端全平台操作系统,Windows,Linux,Mac

    支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。

    支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同。

    支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留进度。

    支持文件夹结构管理,支持新建文件夹,支持文件夹目录导航

    交互友好,能够及时反馈上传的进度;

    服务端的安全性,不因上传文件功能导致JVM内存溢出影响其他功能使用;

    最大限度利用网络上行带宽,提高上传速度;

     

    分析:

    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传

    从上传的效率来看,利用多线程并发上传能够达到最大效率。

     

    解决方案:

    文件上传页面的前端可以选择使用一些比较好用的上传组件,例如百度的开源组件WebUploader,泽优软件的up6,这些组件基本能满足文件上传的一些日常所需功能,如异步上传文件,文件夹,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,甚至是大文件断点续传,大文件秒传。

     

     

    第一步:

    数据库配置

    项目中数据库配置是在DBConfig.java文件中,只需要在此文件中进行数据库配置即可。

    在DBConfig.java文件提供了mysql,SQL Server,Oracle的配置信息,只需要填写对应的数据库配置即可。如果使用的MYSQL就填MySQL数据库的连接信息,如果使用的是Oracle就填写Oracle数据库的连接信息

    upload:{uploadLimit:5,fileSizeLimit:31744,removeTimeout:0.8}

    以上三个变量代表的含义是:

    uploadLimit:表示上传文件个数的限制,5表示文件上传个数限制是5个

    fileSizeLimit:表示上传文件大小的限制,31744单位是KB,也就是表示31M

    removeTimeout:表示移除文件的时间限制

    继续查找使用到这些变量的地方,看到了文件大小超出限制等
    文件大小配置,如果需要限制用户选择的文件大小,则在up6.js中对FileSizeLimit进行配置即可,单位是字节。

    了解了BJUI前端框架对于上传大文件的限制,可以这样使用,增大文件上传大小和数量,可以按照如下进行修改,我们在bjui-all.js文件看到uploadLimit属性和fileSizeLimit属性的限制,我们在jsp文件中可以这样进行替换,这里使用的是覆盖原则,重新定义uploadLimit属性和fileSizeLimit属性,覆盖bjui-all.js文件的默认值设置。

     

    bjui-all.js文件的uploadLimit属性和fileSizeLimit属性对应到jsp文件中的属性就应该这样写,data-upload-limit属性和data-file-size-limit属性,只需要在后面改写为data-upload-limit=“800”和data-file-size-limit=“5131264”即可,一定要注意这里的单位是KB,以上数字表示501M。

     

    关于Uploadify控件属性可以参考这篇文章也可以直接看官网文档:

    https://www.cnblogs.com/yangy608/p/3915349.html

    属性名称

    默认值

    说明

    auto

    true

    设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。

    buttonClass

    按钮样式

    buttonCursor

    ‘hand’

    鼠标指针悬停在按钮上的样子

    buttonImage

    null

    浏览按钮的图片的路径 。

    buttonText

    ‘SELECT FILES’

    浏览按钮的文本。

    checkExisting

    false

    文件上传重复性检查程序,检查即将上传的文件在服务器端是否已存在,存在返回1,不存在返回0

    debug

    false

    如果设置为true则表示启用SWFUpload的调试模式

    fileObjName

    ‘Filedata’

    文件上传对象的名称,如果命名为’the_files’,PHP程序可以用$_FILES['the_files']来处理上传的文件对象。

    fileSizeLimit

    0

    上传文件的大小限制 ,如果为整数型则表示以KB为单位的大小,如果是字符串,则可以使用(B, KB, MB, or GB)为单位,比如’2MB’;

    如果设置为0则表示无限制

    fileTypeDesc

    ‘All Files’

    这个属性值必须设置fileTypeExts属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileTypeDesc为“请选择rar   doc pdf文件”

    fileTypeExts

    ‘*.*’

    设置可以选择的文件的类型,格式如:’*.doc;*.pdf;*.rar’ 。

    formData

     

    JSON格式上传每个文件的同时提交到服务器的额外数据,可在’onUploadStart’事件中使用’settings’方法动态设置。

    height

    30

    设置浏览按钮的高度 ,默认值

    itemTemplate

    false

    用于设置上传队列的HTML模版,可以使用以下标签:
      instanceID – Uploadify实例的ID
      fileID – 列队中此文件的ID,或者理解为此任务的ID
      fileName – 文件的名称
      fileSize – 当前上传文件的大小
      插入模版标签时使用格式如:${fileName}

    method

    Post

    提交方式Post或Get

    multi

    true

    设置为true时可以上传多个文件。

    overrideEvents

     

    设置哪些事件可以被重写,JSON格式,如:’overrideEvents’ : ['onUploadProgress']

    preventCaching

    true

    如果为true,则每次上传文件时自动加上一串随机字符串参数,防止URL缓存影响上传结果

    progressData

    ‘percentage’

    设置上传进度显示方式,percentage显示上传百分比,speed显示上传速度

    queueID

    false

    设置上传队列容器DOM元素的ID,如果为false则自动生成一个队列容器。

    queueSizeLimit

    999

    队列最多显示的任务数量,如果选择的文件数量超出此限制,将会出发onSelectError事件。
      注意此项并非最大文件上传数量,如果要限制最大上传文件数量,应设置uploadLimit。

    removeCompleted

    true

    是否自动将已完成任务从队列中删除,如果设置为false则会一直保留此任务显示。

    removeTimeout

    3

    如果设置了任务完成后自动从队列中移除,则可以规定从完成到被移除的时间间隔。

    requeueErrors

    false

    如果设置为true,则单个任务上传失败后将返回错误,并重新加入任务队列上传。

    successTimeout

    30

    文件上传成功后服务端应返回成功标志,此项设置返回结果的超时时间

    swf

    ‘uploadify.swf’

    uploadify.swf 文件的相对路径。

    uploader

    uploadify.php

    后台处理程序的相对路径。

    uploadLimit

    999

    最大上传文件数量,如果达到或超出此限制将会触发onUploadError事件。

    width

    120

    设置文件浏览按钮的宽度。

    第二步:

    后端修改
    项目采用的最简单的jsp文件,修改起来非常简单。现在提供的DEMO基本上不需要进行其它的修改。只需要对地址进行简单配置就可以立即使用。


    项目的依赖包全部都放在项目的lib目录中,可以直接导入。相关的IDE都能够自动导入,也是非常的简单。

    由于项目后端使用的Spring Boot,本身也就是使用的Spring MVC文件上传部分,Spring MVC使用的是已经对Servlet文件上传封装了的MultipartResolver接口及其相关实现类和一些相关的类,具体的可以看Spring MVC文件上传源码部分,认为Spring源码还是需要读的,我们只要在Spring Boot启动类中注入这个Bean,或者自行写一个WebConfig配置类,注入一些Web相关的Bean即可,这样Spring Boot启动就会加载配置类,也需要自己写拦截器和全局AOP切面,去捕捉文件上传大小超过限制的异常处理等

     

    基于Spring MVC文件上传组件MultipartResolver接口(核心),使用其中的CommonsMultipartResolver(实现了MultipartResolver接口)这个实现类,CommonsMultipartResolver中的maxUploadSize属性是它继承的抽象父类CommonsFileUploadSupport,这个抽象类其中的一个属性是FileUpload类,而这个类又继承自FileUploadBase这个抽象类,其中它的private long sizeMax = -1;就是maxUploadSize属性的最终设置地方。-1表示文件上传大小没有限制,但是我们一般都会设置一个限制值,这里设置的是210763776,这个值的单位是字节,我们将它设置为525336576字节,也就是501M的大小限制。

     

    修改完以上前端和后端,提交修改的代码到git上即可。

     

    第三步:

    Nginx配置

    进入到项目部署发布所在的Linux下,进入nginx服务器所安装的目录,

    进入到nginx服务器所安装的目录

    进入到nginx服务器目录下的conf目录

     

    查看nginx.conf配置文件内容中的client_max_body_size配置的大小,这里设置的是300M。

     

    使用vi或者vim打开nginx.conf配置文件,修改client_max_body_size的大小为501M,保存即可

     

    进入到nginx服务器下的sbin目录下,我们使用./nginx -t查看配置文件是否成功使用,然后使用./nginx -s reload重启Nginx服务器即可。

     

     

    第四步:

    Tomcat配置

    由于项目使用的是Spring Cloud,自然使用Spring Boot,我们这个项目还是使用外置的Tomcat作为他的服务器,便于我们对Tomcat服务器进行优化和设置。

    进入到项目使用的Tomcat服务器的目录

     

    进入到指定项目使用的Tomcat服务器的目录

     

    进入到Tomcat服务器下的conf配置目录中

     

    看到server.xml配置文件后

     

    先行查看Tomcat服务器的配置,其中两个属性对于这次是比较重要的一个是connectionTimeout这个连接超时时间设置以及默认的maxPostSize属性的设置

     

    使用vi或者vim打开server.xml配置文件,修改connectionTimeout的大小为2000000,这个属性的单位是毫秒,换算之后大概是半个小时,我们配置缺省的maxPostSize属性的值,默认情况下它的值是2097152,它的单位是字节,也就是2M的大小,修改完保存即可

     

     

    修改完服务器之后,使用发布工具重新从git上拉取最新的代码和部署发布,重新启动脚本即可完成修改,再次尝试大文件上传,功能基本实现。

     

    以上需要注意的是maxPostSize属性在各个Tomcat版本中的不同,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/09/18/%E4%B8%8A%E4%BC%A0%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/

    欢迎入群一起讨论:374992201

    展开全文
  • 一、开发环境:Ecplise , jdk1.7 , web3.0 二、常见web工程 创建步骤在这里就不详细说了,相信大家都一定是会的,下面给大家看下工程的结构图并说一下所得jar包 工程目录图: ...
  • 折腾了我两天的使用JSPSmartUpload控件进行文件的上传和下载问题终于被解决了,现在将要注意的几个点整理出来,方便自己以后查询的同时分享给大家(内容有参考网上其他博客),希望以后文件的上传和下载不再困扰大家...
  • 最近工作中遇到一个需求:搭建一个Web Server,客户端可以使用curl的post命令来上传文件,同时也要支持客户端直接从服务端硬盘里面下载大文件,于是用Tornado库搭建了一个简单的Web Server。 提供客户端上传文件功能...
  •  文件上传和下载Web 应用中的一个常见功能,相信各位或多或少都曾写过这方面相关的代码。  任何公共组件的设计都必须考虑下面两个问题:  一、如何才能重用?  答:首先,重用的组件必须有用,也...
  • JMeter是Apache组织开发的开源项目,设计之初是Web/HTTP测试,同时它在实现对各种接口的调用方面做的比较成熟,因此,常被用做接口功能测试性能测试。它能够很好的支持各种常见接口,如HTTP(S)、WebService、JDBC...
  • 这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSURLSession代理方法被调用的时机和对上传的数据的序列...
  • struts2 文件上传下载

    2017-08-15 21:22:08
    1.实现 struts2 文件上传,下载 ... 当点击确定的时候,同时进行文件上传和保存当前的这条数据,文件上传到web项目的根指目录的指定文件夹,并且保证每次上传的文件名称是唯一。  首先获得上传的文件类型,例如:上传一
  • 该网站的主要功能有:用户的登录注册、相关课程内容的展示、课程视频的在线观看、电子课件的预览和下载、作业的上传和下载以及后台管理等。最终的成果表明,该网站界面清新自然,色彩搭配良好,以绿色为主色调,符合...
  • 第三方框架 AFNetWorking是很好的一个实现上传和下载的开源框架,在本项目的会议部分,向服务器发送数据,使用的就是AFNetWorking,同时要求封装soap消息体,soap消息体有固定的格式,也可以找到开源的库,实现对...
  • 上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片、pdf、压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等。在守望博客系统中对于上传模块...
  • 一个基于中小型提炼的CS开发框架,覆盖计算机端,web端,手机端的全平台系统模版,在大多数的一对多的系统设计中会包含一些常用的重复的功能代码,例如网络通信机制,客户端版本控制,帐户控制管理,密码修改,公告...
  • 上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片、pdf、压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等。在守望博客系统中对于上传模块...
  • 这种配置的WEB网站初步实现了IP线程线程流量的管理,同时proftpd用于上传资源,ssh用于主机管理。无疑这样可以自己支配宝贵的网络带宽,文章后面有个简单的防火墙配置仅供参考,我用的linux版本是redhat as 3.0。...
  • 点聚weboffice7

    热门讨论 2013-10-15 15:21:07
    同时weboffice7推出了标准版增强版; 免费版用于服务免费用户群体,满足office最基本的在线编辑,保存,打开,修订,保护,套红等常用功能,随时根据新的环境系统免费升级。 增强版用于特殊订制开发用户,提供了...
  • 对在线视频系统进行了设计和实现实现用户视频上传,可以是免费分享,或者设定积分分享自己手中的视频资源,使整个在线视频系统资源的丰富化,多元化。同时每个用户都可以观看别人免费上传的视频,也可以花费少量...
  • Java Web开发技术大全

    2014-11-05 14:35:40
    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
  • java web开发技术大全

    热门讨论 2014-01-08 15:11:52
    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
  • java web技术开发大全(最全最新)

    千次下载 热门讨论 2012-10-10 07:21:38
    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
  • 首先通过易动平台创建一个应用,如何创建参考(web项目一键打包,可同时生成Android、ios端) 创建应用可以创建在线应用离线应用,都可以实现自动更新(热更新)。 ①在线应用热更新 在线应用是用户自行更新的...
  • 文件服务器与web服务器分离的的

    千次阅读 2016-04-06 20:35:52
     要实现的功能是:在一台网络服务器上启动了tomcat服务器,运行一个很大的网站,用户可以登录网站,然后上传文件照片等,由于担心硬盘空间的问题,希望用户上传的文件等,能够上传并保存到另一台机器上,同时用户...
  • 主要功能就是能够让学生方便的查找资料,上传资料和下载资料,同时可以在论坛内进行提问交流等功能。而服务器端则主要是管理员进行对网站的统一管理,实现的主要功能包括教师管理,学生,论坛管理,教师学生上传资料的...
  • Linux web服务器完全解决方案

    千次阅读 2004-09-29 19:31:00
    APACHE+MYSQL+...这种配置的WEB网站初步实现了IP线程线程流量的管理,同时proftpd用于上传资源,ssh用于主机管理。无疑这样可以自己支配宝贵的网络带宽,文章后面有个简单的放火墙配置仅供参考,我用的linux

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 197
精华内容 78
关键字:

web同时实现上传和下载