精华内容
下载资源
问答
  • Web实现文件上传和下载

    千次阅读 2020-05-17 19:59:17
    如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 由于大多数文件的上传都是通过表单的形式...

    目录

    如何实现文件上传

    文件上传相关的API

    Fileltem接口

    DiskFileItemFactory类

    ServletFileUpload类

    【任务】实现文件上传

    【任务目标】

    【实现步骤】

    文件下载

    【任务】实现文件下载

    【任务目标】

    【实现步骤】

    【任务】解决下载中文文件乱码问题

    【任务目标】

    【实现步骤】


    如何实现文件上传

    要实现Web开发中的文件上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。

    由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先要创建一个用于提交上传文件的表单页面。在页面中,需要使用<input type="file">标签在Web页面中添加文件上传输入项。

    <input type="file">标签的使用需要注意以下两点

    • 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。

    • 必须将表单页面的method属性设置为post方式,enctype属性设置为"multipart/form-data"类型

    示例如下

    <%--指定表单数据的enctype属性以及提交方式--%>
    <form enctype="multipart/form-data" method="post">
        <%--指定标记的类型和文件域的名称--%>
        选择上传文件:<input type="file" name="myfile"/><br/>
    </form>
    

    当浏览器通过表单提交上传文件时,由于文件数据都附带在HTTP请求消息体中,并且采用MIME类型(多用途互联网扩展类型)进行描述,在后台使用request对象提供的getInputStream()方法可以读取到客户端提交过来的数据。但是由于用户可能会同时上传多个文件,而在Servlet端直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作。为了方便处理用户上传数据,Apache组织提供了一个开源组件Commons-FileUpload。该组件可以方便地将“multipart/form-data”类型请求中的各种表单域解析出来,并实现一个或多个文件的上传,同时也可以限制上传文件的大小等内容。其性能十分优异,使用及其简单。

    需要注意的是,在使用FileUpdate组件时,要导入commons-fileupload.jar和commons-io.jar两个JAR包,这两个JAR包可以去Apache官网“http://commons.apache.org/”下载(进入该网址后,在Apache Commons Proper下方表格的Components列中找到FileUpload和IO,单击进入后即可找到下载链接)。

    FileUpload组件是通过Servlet来实现文件上传功能的。工作原理如下

    文件上传相关的API

    Fileltem接口

    Fileltem接口在Commons-FileUpload组件中被实现,其主要用于封装单个表单字段元素的数据,一个表单字段元素对应一个Fileltem对象。Commons-FileUpload组件在处理文件上传的过程中,将每一个表单域(包括普通的文本表单域和文件域)封装在一个Fileltem对象中。在此将Fileltem接口的实现类称为Fileltem类,Fileltem类实现了Serializable接口,因此,支持序列化操作。在Fileltem类中定义了许多获取表单字段元素的方法,如下

    (1)boolean isFormField()方法

    isFormField()方法用于判断Fileltem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通文本表单字段,则返回true,否则返回flase。

    (2)String getName()方法

    getName()方法用于获得文件上传字段中的文件名。如果Fileltem类对象对应的是普通文本表单字段,getName()方法将返回null;否则,只要浏览器将文件的字段信息传递给服务器,getName()方法就返回一个字符串类型的结果,如:“C:\Sunset.jpg”。

    需要注意的是,通过不同浏览器上传的文件,获取到的完整路径和名称都是不一样的。例如,用户使用IE浏览器上传文件,获取到的就是完整的路径“C:\Sunset.jpg”;如果使用其他浏览器,比如火狐,获取到的仅仅是文件名,没有路径,如“Sunset.jpg”。

    (3)String getFieldName()方法

    getFieldName()方法用于获得表单字段元素描述头的name属性值,也就是表单标签name属性的值。例如“name=file1”中的“file1”.

    (4)void write(File file)方法

    write()方法用于将Fileltem对象中保存的主体内容保存到某个指定的文件中。如果Fileltem对象中的主体内容是保存在某个临时文件中,那么该方法顺利完成后,临时文件有可能会被清除。另外,该方法也可将普通表单字段内容写入到一个文件中,但它主要用于将上传的文件内容保存到本地文件系统中。

    (5)String getString()方法

    getString()方法用于将Fileltem对象中保存的数据流内容以一个字符串返回,它有连个重载的定义行形式。

    • public String getString()

    • public String getString(java.lang.String encoding)

    在上面两个方法中,前者使用默认的字符编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串。需要注意的是,如果在读取普通表单字段元素内容时出现中文乱码现象,请调用第2个getString()方法,并为之传递正确的字符编码名称。

    (6)String getContentType()方法

    getContentType()方法用于获得上传文件的类型,即表单字段元素描述头属性“Content-Type”的值,如“image/jpeg”。如果Fileltem类对象对应的是普通表单字段,该方法将返回null。

    (7)boolean isInMemory()方法

    isInMemory()方法用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false。

    (8)void delete()方法

    delete()方法用来清空Fileltem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete()方法将删除该临时文件。需要注意的是,尽管Fileltem对象被垃圾收集器收集时会自动清除临时文件,但应该及时调用delete()方法清除临时文件,从而释放系统存储资源,以防系统出现异常,导致临时文件被永久的保存在硬盘中。

    (9)inputStream getInputStream()方法

    getInputStream()方法以流的形式返回上传文件的数据内容。

    (10)long getSize()方法

    getSize()方法返回该上传文件的大小(以字节为单位)。

    DiskFileItemFactory类

    DiskFileItemFactory类用于将请求消息实体中的每一个文件封装成单独的Fileltem对象。如果上传的文件比较小,将直接保存在内存中,如果上传的文件比较大,则会以临时文件的形式,保存在磁盘的临时文件家中。默认情况下,文件保存在内存还是硬盘临时文件夹的临界值是10240,即10KB。DiskFileltemFactory类中包含两个构造方法,如下

    sizeThreshold代表文件保存在内存还是磁盘临时文件夹的临界值。

    repository表示临时文件的存储路径。

    接下来,针对DiskFileltemFactory类的常用方法进行详细讲解,如下

    (1)Fileltem createltem(String fieldName, String contentType, boolean isFormField, String fileName)方法

    该方法用于将请求消息实体创建成Fileltem类型的实例对象。该方法是FileUpload组件在解析请求时,内部自动调用,无需我们管理。

    (2)setSizeThreshold(int sizeThreshold)和getSizeThreshold()方法

    setSizeThreshold()方法用于设置是否将上传文件以临时文件的形式保存在磁盘的临界值。当Apache文件上传组件解析上传的数据时,需要将解析后的数据临时保存,以便后续对数据进一步处理。由于Java虚拟机可使用的内存空间是有限的,因此,需要根据上传文件的大小决定文件的保存位置。例如,一个800MB的文件是无法在内存中临时保存的,这时Apache文件上传组件可以采用临时文件的方式来保存这些数据。但是,如果上传的文件很小,只要600KB,显然将其保存在内存中是比较好的选择。另外,对应的getSizeThreshold()方法用来获取此临界值。

    (3)setRepository(File repository)和getRepository()方法

    如果上传文件的大小大于setSizeThreshold()方法设置的临界值,这时,可以采用setRepository()方法,将上传的文件以临时文件的形式保存在指定的目录下。在默认情况下,采用的是系统默认的临时文件路径,可以通过以下方式获取。

    System.getProperty("java.io.tmpdir")

    另外,对应的getRepository()方法用于获取临时文件。

    ServletFileUpload类

    ServletFileUpload类时Apache组件处理文件上传的核心高级类,通过使用parseRequest(HttpServletRequest)方法可以将HTML中每个表单提交的数据封装成一个Fileltem对象,然后以List列表的形式返回。ServletFileUpload类中包含两个构造方法,如下

    由于在文件上传过程中,FileltemFactory类必须设置,因此,在使用第一个构造方法创建ServletFileUpload对象时,首先需要在解析请求之前调用setFileItemFactory()方法设置fileltemFactory属性。

    ServletFileUpload类的常用方法如下

    (1)setSizeMax(long.sizeMax)和getSizeMax()方法

    setSizeMax()方法继承自FileUploadBase类,用于设置请求消息实体内容(即所有上传数据)的最大尺寸限制,以防止哭护短恶意上传超大文件来浪费服务器端的存储空间。其中,参数sizeMax是以字节为单位。另外,对应的getSizeMax()方法用于读取请求消息试题内容所允许的最大值。

    (2)setFileSizeMax(long file SizeMax)和getFileSizeMax()方法

    setFileSizeMax()方法继承自FileUploadBase类,用于设置单个上传文件的最大尺寸限制,以防止客户端恶意山传超大文件来浪费服务器端的存储空间。其中,参数fileSizeMax是以字节为单位。另外,对应的getFileSizeMax()方法用于获取单个上传文件所允许的最大值。

    (3)parseRequest(javax.servlet.http.HttpServletRequest req)

    parseRequest()方法是ServletFileUpload类的重要方法,它是对HTTP请求消息体内容进行解析的入口。它解析出Form表单中的每个字段的数据,并将他们分别包装成独立的Fileltem对象,然后将这些FileItem对象加入进一个List类型的集合对象中返回。

    (4)getltemlterator(HttpServletRequest request)

    getltemlterator()方法和parseRequest()方法的作用基本相同,但getltemlterator()方法返回的是一个迭代器,该迭代器中保存的不是Fileltem对象,而是FileltemStream对象,如果读者希望进一步提高性能,可以采用getltemlterator()方法,直接获得每一个文件项的数据输入流,作低层处理;如果性能不是问题,希望代码简单,则采用parseRequest()方法即可。

    (5)isMultipartContent(HttpServletRequest req)

    isMultipartContent()方法用于判断请求消息中的内容是否是“multipart/form-data”类型,如果是,则返回true,否则返回false。需要注意的是,isMultipartContent()方法是一个静态方法,不用创建ServletFileUpload类的实例对象即可被调用。

    (6)getFileltemFactory()和setFileItemFactory(FileItemFactory factory)

    这两个方法继承自FielUpload类,分别用于读取和设置fileltemFactory属性。

    (7)setHeaderEncoding(String encoding)方法和getHeader()方法

    这两个方法继承自FileUploadBase类,用于设置和读取字符编码。需要注意的是,如果没有使用setHeaderEncoding()设置字符编码,则getHeaderEncoding()方法返回null,上传组件会采用HttpServletRequest设置的字符编码。但是,如果HttpServletRequest的字符编码也为null,这时,上传组件将采用系统默认的字符编码。获取系统默认字符编码的方式如下

    System.getProperty("file.encoding");

    【任务】实现文件上传

    【任务目标】

    使用文件上传的相关知识,实现文件的上传功能

    【实现步骤】

    1.创建项目,导入JAR包

    在Eclipse中创建一个名称为chapter12的Web项目,在项目的WEB-INF/lib目录下导入JAR包commons-fileupload-1.3.1.jar和commons-io-2.4.jar,并发布到类路径下。导入JAR包的项目结构如下

    2.创建上传页面

    在chapter12项目的WebContent目录下创建一个名称位form的jsp页面,该页面用于提供文件上传的Form表单,需要注意的是,Form表单的enctype属性值要设置为“multipart/form-data”,method属性值要设置为“post”,并将其action的属性值设置为“UploadServlet”。form.jsp的代码如下

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
      <head>
      	<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
      	<title>文件上传</title>
      </head>
      <body>
        	<form action="UploadServlet" method="post" enctype="multipart/form-data">
        	<table width="600px">
        		<tr>
        			<td>上传者</td>
        			<td><input type="text" name="name"/></td>
        		</tr>
        		<tr>
        			<td>上传文件</td>
        			<td><input type-"file" name="myfile"></td>
        		</tr>
        		<tr>
        			<td><input type="submit" value="上传"/></td>
        		</tr>
        	</table>
        	</form>
      </body>
    </html>
    

    3.创建Servelt

    在项目的src目录下创建一个名称为cn.itcast.fileupload的包,在该包中编写一个名称为UploadServlet的类,该类主要用户获取表单以及其上传文件的信息,其具体代码如下

    package cn.itcast.fileupload;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.*;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    //上传文件的Servlet类
    public class UploadServlet extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		try {
    			//设置ContentType字段值
    			response.setContentType("text/html;charset=utf-8");
    			//创建DiskFileItemFactory工厂对象
    			DiskFileItemFactory factory = new DiskFileItemFactory();
    			//设置文件缓存目录,如果该目录不存在则新创建一个
    			File f = new File("E:\\TempFolder");
    			if (!f.exists()) {
    				f.mkdirs();
    			}
    			//设置文件的缓存路径
    			factory.setRepository(f);
    			//创建ServletFileUpload对象
    			ServletFileUpload fileupload = new ServletFileUpload(factory);
    			//设置字符编码
    			fileupload.setHeaderEncoding("utf-8");
    			//解析request,得到上传文件的FileItem对象
    			List<FileItem> fileitems = fileupload.parseRequest(request);
    			//获取字符流
    			PrintWriter writer = response.getWriter();
    			//遍历集合
    			for (FileItem fileitem : fileitems) {
    				//获得字段名和字段值
    				String name = fileitem.getFieldName();
    				if(name.equals("name")) {
    					//如果文件不为空,将其保存在value中
    					if(!fileitem.getString().equals("")) {
    						String value = fileitem.getString("utf-8");
    						writer.print("上传者:"+value+"<br/>");
    					}
    				}
    			} else {
    				//获取上传的文件名
    				String filename = fileitem.getName();
    				//处理上传文件
    				if(filename != null && !filename.equals("")) {
    					writer.print("上传的文件名称是:"+filename+"<br/>");
    					//截取出文件名
    					filename = filename.substring(filename.lastIndexOf("\\")+1);
    					//文件名要唯一
    					filename = UUID.randomUUID().toString()+"_"+filename;
    					//在创建服务器创建同名文件
    					String filepath = getServletContext().getRealPath(webPath+filename);
    					//创建文件
    					File file = new File(filepath);
    					file.getParentFile().mkdirs();
    					file.createNewFile();
    					//获得上传文件流
    					InputStream in = fileitem.getInputStream();
    					//使用FileOutputStream打开服务器端的上传文件
    					FileOutputStream out = new FileOutputStream(file);
    					//流的对拷
    					byte[] buffer = new byte[1024];//每次读取1个字节
    					int len;
    					//开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
    					while ((len = in.read(buffer)) > 0) {
    						out.write(buffer, 0, len);
    						//关闭流
    						in.close();
    						out.close();
    						//删除临时文件
    						fileitem.delete();
    						writer.print("上传文件成功!<br/>");
    					}
    				}
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    4.启动项目,查看运行结果

    文件下载

    直接使用Servlet类和输入/输出流实现。与访问服务器文件不同的是,要实现文件的下载,不仅需要指定文件的路径,该需要在HTTP协议中设置两个响应消息头,如下

    //设定接收程序处理数据的方式
    Content-Disposition:attachment; filename =
    //设定实体内容的MIME类型
    Content-Type:application/x-msdownload

    浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式未下载方式。当单击【下载】超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载的文件内容,最后将读取的内容通过输出流写到目标文件中。

    【任务】实现文件下载

    【任务目标】

    通过文件上传知识及文件下载原理的学习,实现文件的下载功能。

    【实现步骤】

    1.创建下载页面

    在chapter12项目的WebContent目录下创建下载页面download.jsp,该页面中编写了一个用于下载的链接。如下

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
      	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      	<title>文件下载</title>
      </head>
      <body>
      	<a href="/chapter12/DownloadServlet?filename=1.jpg"}>文件下载</a>
      </body>
    </html>

    2.创建Servlet

    在cn.itcast.fileupload包中创建DownloadServlet类,该类主要用于设置所要下载的文件以及文件在浏览器中的打开方式。DownloadServlet类的实现代码如下

    package cn.itcast.fileupload;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class DownloadServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//设置ContentType字段值
    		response.setContentType("text/html;charset=utf-8");
    		//获取所要下载的文件名称
    		String filename = request.getParameter("felename");
    		//下载文件所在目录
    		String folder = "/download";
    		//通知浏览器以下载的方式打开
    		response.addHeader("Content-Type", "application/octet-stream");
    		response.addHeader("Content-Disposition", "attachment; filename="+filename);
    		//通过文件流读取文件
    		InputStream in = getServletContext().getResourceAsStream(folder+filename);
    		//获取response对象的输出流
    		OutputStream out = response.getOutputStream();
    		byte[] buffer = new byte[1024];
    		int len;
    		//循环取出流中的数据
    		while ((len = in.read(buffer)) != -1) {
    			out.write(buffer, 0, len);
    		}
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    3.创建下载目录及文件

    在项目的WebContent目录下创建一个名称为download的文件夹(Folder),在该文件夹中放置一个名称为“1.jpg”的图片文件。

    4.启动项目,查看结果

    【任务】解决下载中文文件乱码问题

    【任务目标】

    在操作服务器中的资源时,资源文件名的中文乱码问题一直是需要解决的问题。在上一小节中如果将文件的名称“1.jpg”重名为“风景.jsp”,通过浏览器再次下载文件,此时浏览器的显示结果如下

    当文件名为中文时,下载的文件名称没有显示出来,这是因为在下载时,程序没有对中文进行处理,在输出中文字符串时出现了乱码。

    为了解决上述出现的乱码问题,ServletAPI中提供了一个URLEncoder类,该类定义的encode(String s, String enc)方法可以将URL中的字符串以指定的编码形式输出,通常这种编码方式称为URL编码。HTTP消息头的数据只有经过URL编码成世界通用的符号后,才不会在传输过程中出现乱码问题。

    【实现步骤】

    1.修改Servlet类

    使用URLEncoder类的encode(String s, String enc)方法对文件DownloadServlet.java进行改写,改写后的代码如下

    package cn.itcast.fileupload;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class DownloadServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//设置ContentType字段值
    		response.setContentType("text/html;charset=utf-8");
    		//设置响应消息编码
    		response.setCharacterEncoding("utf-8");
    		//设置请求消息编码
    		request.setCharacterEncoding("utf-8");
    		//获取所要下载的文件名称
    		String filename = request.getParameter("felename");
    		//对文件名称编码
    		filename = new String(filename.trim().getBytes("iso8859-1"),"UTF-8");
    		//下载文件所在目录
    		String folder = "/download";
    		//通知浏览器以下载的方式打开
    		response.addHeader("Content-Type", "application/octet-stream");
    		response.addHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(filename,"utf-8"));
    		//通过文件流读取文件
    		InputStream in = getServletContext().getResourceAsStream(folder+filename);
    		//获取response对象的输出流
    		OutputStream out = response.getOutputStream();
    		byte[] buffer = new byte[1024];
    		int len;
    		//循环取出流中的数据
    		while ((len = in.read(buffer)) != -1) {
    			out.write(buffer, 0, len);
    		}
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    2.修改下载页面

    在文件download.jsp中,同样使用URLEncoder类的encode(String s, String enc)方法对下载地址中的中文进行编码,如下

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@page import="java.net.URLEncoder" %>>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
      	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      	<title>文件下载</title>
      </head>
      <body>
      	<a href="/chapter12/DownloadServlet?filename=<%=URLEncoder.encode("风景.jpg", "utf-8") %>">文件下载</a>
      </body>
    </html>
    

    3.运行项目,查看结果

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • webupload上传与下载文件,web实现文件上传下载,Java源码.zip
  • 主要为大家详细介绍了java web FTPClient实现上传文件到指定服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • ASP.NET 在WEBAPI中开发文件上传功能。以及MVC中如何调用
  • 断点续传,springboot+webuploader +mysql 实现断点续传功能
  • ASP.NET WebAPI 接口 实现单文件,多文件上传下载,图片缩略图访问实现接口,实用于APP,web系统应用,上传下载文件、图片访问分离处理。
  • vs2013 c++实现上传的客户端,服务端为java写的web工程,模拟post方法,可以上传文件
  • 通过flask框架实现文件上传与下载
  • 1. C#实现Web文件的上传 使用C#如何实现文件上传的功能呢?下面笔者简要介绍一下。 首先,在你的Visual C# web project 中增加一个上传用的Web Form,为了要上传文件,需要在ToolBox中选择HTML类的File Field控件,将...
  • 前两天发表利用FormData进行文件上传,然后有人问要是大文件几个G上传怎么搞,常见的不就是分片再搞下断点续传,动动手差不多也能搞出来,只不过要深入的话,考虑的东西还是很多。由于断点续传之前写个几篇,这里...
  • 使用webupload实现了在C# .net项目中的断点续传演示(绝对不亏的,现在.net中webupload服务端好多都不完整,我这个是自己写完用到项目中的,比较稳定,虽然代码比较初级,后面也没整理) 演示地址:...
  • WebApi 文件 上传 下载,包括上传下载调用的例子,请先还原nuget包
  • 需求背景:以前在做文件上传下载,都是基于FrameWork项目或者Core Web项目实现文件上传或下载,基于web的文件下载及权限比较好实现的。但是现在很多公司技术领导层,都在推行前后端分离理念,所以这一次我承担了...
  • 文件上传状态类(FileUploadStatus)2.1.2.文件上传状态侦听类(FileUploadListener)2.1.3.后台服务类(BackGroundService)2.1.4.文件上传状态控制类(BeanControler)2.2.客户端代码2.2.1.AjaxWrapper.js2.2.2....
  • asp.net下实现支持文件分块多点异步上传Web Services
  • 采用jsp+servlet的形式实现文件上传与下载。
  • 有的同学第一反应是: 只有文件才能下载. 所以大多数同学会想到先把数据从数据库中读出来,然后写入到服务器中的某个文件夹下生成文件, 然后再下载. 其实这是非常不效率的方法, 最简单的方法是,我们从数据库中读取到...
  • 因此,给用户提供一个文件上传进度条,是每一个尊重客户的程序员应做到的最起码的职业操守。 本文中包含的知识点包括:进度条的实现、本地文件读取到字节数组、ajax等。这些知识点都可以在容百川上传的资料中得到。
  • 主要介绍了ASP.NET WebAPi(selfhost)实现文件同步或异步上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java web项目实现文件上传和文件下载功能 2019-07-04 你源 今天来讲一下java web文件上传和文件下载,文件上传有很多种方式。现将这些方式分享给大家。还是全力以赴每一天[韬光养晦 厚积薄发]~~~~ 文件下载 //文件...

    java web项目实现文件上传和文件下载功能

    2019-07-04 你源

    今天来讲一下java web文件上传和文件下载,文件上传有很多种方式。现将这些方式分享给大家。还是全力以赴每一天[韬光养晦 厚积薄发]~~~~

    文件下载

    //文件下载功能
    
    // 前台页面我用的是Easyui框架写的前台页面
      <!-- 页面加载开始 -->
         	<div id="panel_datagrid_uploads_m080" title="文件上传" class="easyui-panel" data-options="fit:true" border="false">
    		<div id="toolbar_uploads_m080">
    		<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" onclick="openDownloadsAdd_m080()">文件下载</a>
    		</div>
    		</div>
      <!--页面加载结束-->
      <!--打开文件下载窗口开始  -->
    	 	<div id="dialog_add_downloads_m080"
    		style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">
    	    <a href="" id="ssUrl" class="easyui-linkbutton">文件下载</a>  
    		</div>
     <!--打开文件下载窗口结束  -->	
    
    //页面所对应的的js文件
    
    //文件下载
    //dialog
    var dialog_add_downloads_m080;
    function openDownloadsAdd_m080(){
    	dialog_add_downloads_m080=$('#dialog_add_downloads_m080').show().dialog({
    		title:'文件下载',
    		modal:true
    	});
    }
    //文件下载 filename是需要从数据库查询出来现将定义成固定值myfile.txt
    var filename="myfile.txt";
    $("#ssUrl").attr('href',"uploadfile/download?filename="+filename);
    
    // java后台代码篇
    
    //  java代码篇
    @RequestMapping(value = {"/download"},method = RequestMethod.GET)
    	public void download(@RequestParam("filename") String filename, HttpServletRequest request,HttpServletResponse response) throws IOException {
    		if(!StringUtils.isEmpty(filename)) {
    			//模拟文件,myfile.txt为需要下载的文件  
    	        String path = "D:\\file"+"\\"+filename; 
    	        //创建添加定义获取文件
    	        File file=new File(path);
    	        //创建添加定义获取该文件的文件输入流
                FileInputStream fileInputStream=new FileInputStream(file);
    		    //创建添加定义将文件输入流放在输入流里
                InputStream inputStream=new BufferedInputStream(fileInputStream);
                //创建添加定义转码防止文件名中文乱码
    		    filename=URLEncoder.encode(filename,"UTF-8");
    		    //创建添加定义设置文件下载头
    		    response.setHeader("Content-Disposition", "attachment;filename=" + filename);
    		    //创建添加定义设置下载文件类型
    		    response.setContentType("multipart/form-data");
    		    //创建添加定义获取文件输出流
    		    BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(response.getOutputStream());
    		    int len=0;
    		    while((len = inputStream.read()) != -1){  
    		    	bufferedOutputStream.write(len);  
    		    	bufferedOutputStream.flush();  
    	        }  
    		    bufferedOutputStream.close();
    		}
    		
    	}
    

    文件下载功能注意几点,我的下载的路径固定为"D:\file"+"\"+filename;这个路径,也可是Tomcat发布好的webapps下。注意文件名的拼写,注意路径的配置。如有问题可以留言讨论哦。

    文件上传

    文件上传的第一种方式(直接使用form表单提交)
    // 直接使用form表单提交
    
    // 前台页面直接使用form表单提交
       <div>
            <!-- 第一种方式直接使用form表单的方式实现文件上传 -->
        	<form action="${pageContext.request.contextPath}/user/uploadfile/uploadfile1" method="post" enctype="multipart/form-data">
        	<input type="file" name="ffFile" />
        	<input type="submit" value="上传" />
        	</form> 
        </div> 
    
    //后台java代码
    
    // 后台java代码
    /**
    	 * 创建添加定义一个使用Spring实现文件上传
    	 * @param request
    	 * @return
    	 * @throws IOException 
    	 * @throws IllegalStateException 
    	 */
    	@RequestMapping("/uploadfile1")
    	@ResponseBody
    	public ResultJson springUpload1(HttpServletRequest request) throws IllegalStateException, IOException {
    	    ResultJson resultJson=new ResultJson();
    	    //获取从1970年到现在的毫秒数
    	    Long startTime=System.currentTimeMillis();
    	    //将当前上下文初始化给CommonsMultipartResolver(多部分解析器)
    	    CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
    	    //检查form表单中有没有enctype="multipart/form-data"这个属性
    	    if(commonsMultipartResolver.isMultipart(request))
            {
    	    //将request转换成多部分请求
    		MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;
    		//获取multipartHttpServletRequest的所有的文件名
    		Iterator irIterator=multipartHttpServletRequest.getFileNames();
    		while(irIterator.hasNext()) {
    		MultipartFile multipartFile=multipartHttpServletRequest.getFile(irIterator.next().toString());
    		if(multipartFile!=null){
    			String path="E:/springUpload/"+multipartFile.getOriginalFilename();
    			// 检查该路径对应的目录是否存在,如果不存在则创建目录
    						File dir = new File(path);
    						if (!dir.exists()) {
    							dir.mkdirs();
    						}
    			//上传
    				
    			 multipartFile.transferTo(new File(path));
    		}
    		}
            }
    	    Long endTime=System.currentTimeMillis();
    	    System.out.println("文件上传一共用时 "+String.valueOf(endTime-startTime)+" 毫秒");
    	    return resultJson;
    	}
    	
    

    注释很清楚啦。有问题评论我会给你解决的哦。

    文件上传的第二种方式(使用ajax的formData的方式实现文件上传)
    //使用ajax的formData的方式实现文件上传
    
    // 前台页面使用ajax的formData的方式实现文件上传
         <!--第二种方式使用ajax的formData的方式实现文件上传  -->
    	 <!--打开文件上传窗口开始  -->
    	 	<div id="dialog_add_uploads_m080"
    		style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">
    		<form id="tf">
                <input  class="easyui-filebox" name="ffFile"/>
                <input class="easyui-linkbutton" data-options="iconCls:'icon-ok'" value="文件上传" onclick="test();" "/>
            </form>
    		</div>
    	 <!--打开文件上传窗口结束  -->	
    
    // 前台页面所对应的js文件
    
    // 前台页面所对应的js文件
    //文件上传1
    // add dialog 
    var dialog_add_uploads_m080;
    function openUploadsAdd1_m080(){
    	dialog_add_uploads_m080=$('#dialog_add_uploads_m080').show().dialog({
    		title:'文件上传1',
    		modal:true
    	});
    }
    //这个是在jsp页面中写的js,需要获取项目的根路径不可以使用相对路径
      <script type="text/javascript">
        var rootPath="${pageContext.request.contextPath}";
        function test(){
        	 var form = new FormData(document.getElementById("tf"));
        	 $.ajax({
                 url:rootPath+"/user/uploadfile/uploadfile",
                 type:"post",
                 data:form,
                 cache: false, 
                 processData:false,
                 contentType:false,
                 success:function(data){
                	 if(data!=null){
                     console.log("成功不为空");
                     alert("成功不为空!");
                	 }else{
                     console.log("失败为空");
                     alert("失败!");
                	 }
                	 },
                 error:function(e){
                     alert("错误!!"+e);
                     window.close(); 
                 }
             });            
        }
        </script>
    
    // java后台代码
    
    // 第二种方式使用ajax的formData的方式实现文件上传
    
    	/**
    	 * 创建添加定义一个 使用Spring实现文件上传
    	 * 
    	 * @return
    	 */
    	@RequestMapping("/uploadfile")
    	@ResponseBody
    	public ResultJson springUpload(HttpServletRequest request) {
    		ResultJson json = new ResultJson();
    		MultipartFile uploadFile = ((MultipartHttpServletRequest) request).getFile("ffFile");
    		uploadFile(uploadFile, request);
    		return json;
    	}
    	public String uploadFile(MultipartFile multipartFile,HttpServletRequest request) {
    		String fileName = null;
    		System.out.println("------------------------------------0202020202020202------------------------------------");
    		if (multipartFile != null) {
    			DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    			String orgFileName = multipartFile.getOriginalFilename();
    			//fileName = format.format(new Date()) + orgFileName;
    			if(!SysUtil.isNULL(orgFileName)){
    				fileName = format.format(new Date()) + "-" + orgFileName;
    				// 设置保存路径
    				String path = request.getServletContext().getRealPath("/upload");
    				// 检查该路径对应的目录是否存在,如果不存在则创建目录
    				File dir = new File(path);
    				if (!dir.exists()) {
    					dir.mkdirs();
    				}
    				String filePath = path + "\\" + fileName;
    				
    				System.out.println(filePath + "controller path");
    				File file = new File(filePath);
    				try {
    					multipartFile.transferTo(file);
    				} catch (IllegalStateException e) {
    					System.out.println(e.getMessage());
    				} catch (IOException e) {
    					System.out.println(e.getMessage());
    				} 
    			}
    			
    		}
    		return fileName;
    	}
    

    链接: link.
    https://blog.csdn.net/qq_35759451
    图片: Alt
    欢迎加我qq讨论技术2917055611

    展开全文
  • 前端webupload +后端 springboot 实现文件上传下载,可实现断点续传,秒传,亲测可用
  • 主要介绍了Java Web使用Html5 FormData实现文件上传功能,需要的朋友可以参考下
  • easyui webserver 实现文件上传下载

    热门讨论 2015-03-30 11:44:24
    easyui webserver 实现文件上传下载
  • 通过一些代码可以简单的实现点击图片弹出上传文件窗口,省去使用fileupload标签,具体的实现如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
  • Java Web文件上传功能实现

    千次阅读 2018-04-14 14:13:27
    注意要校验是否选择文件上传,最开始写的时候没有加上校验,没有选择文件,提交表单后一直报异常。当然也可以在前台加上js判断是否选择文件前台页面代码&lt;%@ page language="java" contentType=&...

    本文主要关于利用html表单上传文件的后台代码实现。

    需要用到两个工具类Apache commons-fileupload和commons-io。

    注意要校验是否选择文件上传,最开始写的时候没有加上校验,没有选择文件,提交表单后一直报异常。

    当然也可以在前台加上js判断是否选择文件

    前台页面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文件上传</title>
    </head>
    <body>
    
    <form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
    	<input type="text" name="username">
    	<input type="file" name="upload">
    	<input type="submit" value="提交">
    </form>
    
    
    </body>
    </html>

    后台Java Servlet代码

    
    package demo;
    
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.List;
    import java.util.Map;
    
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.IOUtils;
    
    
    public class UploadServlet extends HttpServlet {
    	
    
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		try {
    			//1、创建磁盘文件项工厂
    			//获取web根目录下放置缓存文件的文件夹“temp”的物理路径
    			String path_temp = this.getServletContext().getRealPath("temp");
    			File file =  new File(path_temp) ;
    			DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, file);//1024*1024为设置文件缓存大小
    			//也可以new一个空参的factory,随后再设置缓存大小,和缓存位置
    			//DiskFileItemFactory factory = new DiskFileItemFactory();
    			//factory.setSizeThreshold(1024*1024);
    			//factory.setRepository(file);
    				
    			//2、创建文件上传的核心类
    			ServletFileUpload upload = new ServletFileUpload(factory);
    			//设置上传文件名称的编码为UTF-8,不设置有可能会出现中文乱码,编码规范要进行设置。
    			upload.setHeaderEncoding("UTF-8");
    			//判断表单是否是文件上传表单,只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
    			boolean multipartContent = upload.isMultipartContent(request);
    			if(multipartContent) {
    				//是文件上传的表单,解析request获得文件项集合
    				List<FileItem> parseRequest = upload.parseRequest(request);
    				if(parseRequest!=null) {
    					for(FileItem item :parseRequest) {
    						//判断是不是普通表单项
    						boolean formField = item.isFormField();
    						if(formField) {
    							//如果是普通表单项
    							String fieldName = item.getFieldName();
    							String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
    							//当表单是enctype="multipart/form-data"时,request.getParameter相关的方法都失效,所以要用上面的方法获得值
    							//String parameter = request.getParameter("username");//获取不到,失效!
    							System.out.println("表单值为:"+fieldName+"="+fieldValue);
    						}else {
    							//如果是文件上传项							
    							String name = item.getName();
    							System.out.println("文件名为:"+name);
    							System.out.println(item);
    							//加入判断文件是否上传,如果不加判断,前台没有选择文件,提交后会报IO空指针异常
    							if(item.getSize()==0L) {
    								response.setContentType("text/html;charset=UTF-8");
    								response.getWriter().write("请上传文件");
    								return;
    							}
    							if(name=="") {
    								response.setContentType("text/html;charset=UTF-8");
    								response.getWriter().write("文件名不能为空");
    								return;
    							}
    							InputStream in = item.getInputStream();
    							String path_store = this.getServletContext().getRealPath("upload");
    							OutputStream out = new FileOutputStream(path_store+"/"+name);
    							IOUtils.copy(in, out);
    							in.close();
    							out.close();
    							//删除临时文件
    							item.delete();
    						}
    						
    					}					
    				}
    				response.setContentType("text/html;charset=UTF-8");
    				response.getWriter().write("是文件上传");
    				
    			}else {
    				//不是文件上传表单,可以使用原始的获取表单数据方式request.getParameter();
    				//只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
    				Map<String, String[]> parameterMap = request.getParameterMap();
    				response.setContentType("text/html;charset=UTF-8");
    				response.getWriter().write("不是文件上传表单");
    			}
    		} catch (FileUploadException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    } 
    


    展开全文
  • 文件上传Web端C++实现

    千次阅读 2019-05-05 17:30:03
    cout << "<title>CGI 中的文件上传</title>\n"; cout << "</head>\n"; cout << "<body>\n"; // 获取要被上传的文件列表 const_file_iterator file = cgi.getFile("file"); if(file != cgi.getFiles().end())...

    1.安装Apache并配置CGI
    http://www.360doc.com/content/15/0402/20/21202678_460158309.shtml
    2.安装过程中报错
    APR not found:
    https://blog.51cto.com/xtony/836508
    undefined reference ssl:
    http://www.it610.com/article/3153786.htm
    make install报错:
    http://www.it610.com/article/4988144.htm
    启动报错:
    https://blog.csdn.net/zhaomininternational/article/details/42293511
    3.测试
    在apache的 cgi-bin 目录下创建c++文件
    cplusplus.cpp

    #include <iostream>
    using namespace std;
    
    int main ()
    {
    
       cout << "Content-type:text/html;charset=utf-8\r\n\r\n";
       cout << "<html>\n";
       cout << "<head>\n";
       cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
       cout << "</head>\n";
       cout << "<body>\n";
       cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
       cout << "</body>\n";
       cout << "</html>\n";
    
       return 0;
    }
    

    g++ cplusplus.cpp -o cplusplus.cgi

    在浏览器中访问
    在这里插入图片描述
    测试成功

    4.编写c++程序用于接收post请求时携带的表单文件
    a.安装CGI库
    https://www.runoob.com/cplusplus/cpp-web-programming.html
    b.在apache的 cgi-bin 目录下创建c++文件
    cpp_uploadfile.cpp

    #include <iostream>
    #include <vector>  
    #include <string>  
    #include <stdio.h>  
    #include <stdlib.h> 
    #include <fstream>
     
    #include <cgicc/CgiDefs.h> 
    #include <cgicc/Cgicc.h> 
    #include <cgicc/HTTPHTMLHeader.h> 
    #include <cgicc/HTMLClasses.h>
     
    using namespace std;
    using namespace cgicc;
     
    int main ()
    {
       Cgicc cgi;
     
       cout << "Content-type:text/html;charset=utf-8\r\n\r\n";
       cout << "<html>\n";
       cout << "<head>\n";
       cout << "<title>CGI 中的文件上传</title>\n";
       cout << "</head>\n";
       cout << "<body>\n";
     
       // 获取要被上传的文件列表
       const_file_iterator file = cgi.getFile("file");
       if(file != cgi.getFiles().end()) {
          // 在 cout 中发送数据类型
          cout << HTTPContentHeader(file->getDataType());
          cout << file->getFilename() << endl;
    
          string file_path = "/home/liyongjun/project/my/html/files/";
    
          file_path += file->getFilename();
    
          // 以写模式打开文件
          ofstream outfile;
          outfile.open(file_path.data());
    
          // 再次向文件写入用户输入的数据
          outfile << file->getData() << endl;
    
          // 关闭打开的文件
          outfile.close();
       }
       cout << "<文件上传成功>\n";
       cout << "</body>\n";
       cout << "</html>\n";
       
       return 0;
    }
    

    sudo g++ -o cpp_uploadfile.cgi cpp_uploadfile.cpp -lcgicc

    c.用postman测试
    在这里插入图片描述
    Web端成功收到文件并存储
    在这里插入图片描述
    d.如果无法保存文件,可能是权限问题,这里我把用户和组改成了自己
    sudo vim httpd.conf

    User liyongjun
    Group liyongjun
    
    展开全文
  • 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。 <!--引入CSS--> <link rel=stylesheet type=text/css href=webuploader文件夹/webuploader.css> <!--引入JS--> [removed] [removed] ...
  • 用C语言编写的WEB CGI后台接口实现网页文件上传下载功能 用C语言也能进行WEB后端开发,编写controller控制器 本文给出上传下载文件的C语言源码实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,753
精华内容 96,701
关键字:

web实现文件上传