JavaWeb 文件上传与下载

JavaWeb的文件上传和下载 一、学习目标 文件上传相关API (1)Fileltem接口 (2)DiskFileltemFactory类 (3)ServletFieltemFactory类 文件下载 (1)实现文件下载 (2)解决下载文件中文文件乱码 二、重点知识 要实现Web开发中的文件上传功能,通常需完成两步操作:一是在Web页面中添加上传输入项:二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。接下来,本节将对这两步操作内容进行详细讲解。 由于大多数文件的.上传都是通过表单的形式提交给服务器的,因此, 阅读详情

一、文件上传

       实现 Web 开发中的文件上传功能,两个操作:在 Web 页面添加上传输入项,在 Servlet 中读取上传文件的数据并保存在本地硬盘中。

     1、Web 端上传文件。在 Web 页面中添加上传输入项:<input type="file"> 设置文件上传输入项时应注意:(1) 必须设置 input 输入项的 name 属性,否则浏览器将不会发送上传文件的数据。(2) 必须把 form 的 enctype 属性设为 multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在 http 请求消息体中,并使用 MIME 协议对上传文件进行描述,以方便接收方对上传数据进行解析和处理。(3) 表单提交的方式要是 post

         2、服务器端获取文件。如果提交表单的类型为 multipart/form-data 时,就不能采用传统方式获取数据。因为当表单类型为 multipart/form-data 时,浏览器会将数据以 MIME 协议的形式进行描述。如果想在服务器端获取数据,那么我们必须采用获取请求消息输入流的方式来获取数据。

         3、Apache-Commons-fileupload。为了方便用户处理上传数据,Apache 提供了一个用来处理表单文件上传的开源组建。使用 Commons-fileupload 需要 Commons-io 包的支持。

         4、fileuplpad 组建工作流程

              (1)客户端将数据封装在 request 对象中。

              (2)服务器端获取到 request 对象。

              (3)创建解析器工厂 DiskFileItemFactory 。

              (4)创建解析器,将解析器工厂放入解析器构造函数中。之后解析器会对 request 进行解析。

              (5)解析器会将每个表单项封装为各自对应的 FileItem。

              (6)判断代表每个表单项的 FileItem 是否为普通表单项 isFormField,返回 true 为普通表单项。

              (7)如果是普通表单项,通过 getFieldName 获取表单项名,getString 获得表单项值。

              (8)如果 isFormField 返回 false 那么是用户要上传的数据,可以通过 getInputStream 获取上传文件的数据。通过getName 可以获取上传的文件名。

               

 

            5、DiskFileItemFactory。DiskFileItemFactory 是创建 FileItem 对象的工厂,常用的方法有:

          setSizeThreshold(int sizeThreshold,File repository ) 设置内存缓冲区的大小,默认值为 10k 当上传文件大于缓冲区大小时,fileupload 组建将使用临时文件缓存上传文件。还可以设置临时文件目录。

          setRepository(File repository) 指定临时文件目录默认值为 System.getProperty("java.io.tmpdir")

       6、ServletFileUpload。ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中,常用方法有:

          isMultipartContent(HttpServletRequest request) 判断上传表单是否为 multipart/form-data。

          parseRequest(HttpServletRequest request) 解析 request 对象,并把表单中的每一个输入项包装成一个 fileItem 对象,并反悔一个保存了所有 FileItem 的 List 集合。

          setFileSizeMax(long fileSizeMax) 设置上传文件的最大值。

          setSizeMax(long sizeMax) 设置上传文件总量的最大值。

          setHeaderEncoding(String encoding) 设置编码方式。

          setProgressListener(ProgressListener pListener) 指定一个监听器。

 

package upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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;

@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet {

	@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(new File("d:/temp"));
		ServletFileUpload upload = new ServletFileUpload(factory);
		if (ServletFileUpload.isMultipartContent(request)) {
			try {
				List<FileItem> list = upload.parseRequest(request);
				for (FileItem item : list) {
					if (item.isFormField()) {
						System.out.println("普通字段:"
								+ item.getString());
					} else {
						InputStream in = item.getInputStream();
						String fileName = item.getName();
						FileOutputStream fos = new FileOutputStream(this.getServletContext().getRealPath("/WEB-INF/upload")+"/" + fileName);
						int len = 0;
						byte[] b = new byte[1024];
						while ((len = in.read(b)) != -1) {
							fos.write(b, 0, len);
						}
						fos.close();
					}
				}
			} catch (FileUploadException e) {
				request.setAttribute("message", "上传失败。。");
				request.getRequestDispatcher("/message").forward(request,
						response);
			}
		}
	}

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

}

FileItem.getFieldName() 获取的是普通表单项的表单项名。

FileItem.getString(encod) 获取的是普通表单项的表单项值。

FileItem.getName() 获取的是上传文件的文件名,如果是 IE6 则获取的是全路径,否则获取的是简单文件名。

            7、上传文件的细节问题

                (1)如果将服务器的上传目录暴露在外界能访问到的地方,那么用户可以写一个系统命令文件传至服务器,只有再访问执行。为了解决这个问题,有两种途径,一:将上传目录放在 WEB-INF 中。 二:放在服务器管理不到的目录内。

                (2)上传文件的乱码问题

                         一:普通表单项乱码,因为上传文件的 enctype 为 multipart/form-data 所以我们使用传统的 setCharacterEncoding 是不可行的。所以我们在获取到值的时候,必须先将其按照 ISO-8859-1 的形式转为字节,再按照 UTF-8 的形式转为字符。1 手工解决:String value = fileItem.getString("username"); value = new String(value.getBytes("iso-8859-1") ,"UTF-8"); 这是一种方法。2 组建解决:还可以使用 fileItem.getString("UTF-8") 来直接解决普通表单项的乱码。

                         二:上传文件的文件名乱码,通过解析器的方法更改字符编码。servletFileUpload.setHeaderEncoding("UTF-8");

                 (3)没有选择文件空提交问题

                          判断文件名是否为空 String filename = fileItem.getName(); 判断 filename 是否为空,如果为空则不处理。

                 (4)限制上传文件类型,判断文件是否为合法文件

                          通过截取文件扩展名,来匹配服务器中的集合,如果包含则允许执行上传,如果不包含则抛一个自定义编译时异常,在 catch 代码块中往 request 域中添加显示信息,转发到 Jsp 中给用户提示。

                 (5)限制上传文件大小

                           通过解析器来限定上传文件大小,servletFileUpload.setFileSizeMax(1024*1024); 其中限制的单位为 byte。如果超出限制大小,则抛出 FileSizeLimitExceedException 编译时异常。捕获异常的处理方式和上面一样。

                 (6)防止上传文件被覆盖的问题

                            服务器在保存每一个上传文件时,要为每一个文件生成一个唯一的文件名。我们采用 UUID + 真实文件名作为服务器存储的文件名。sdfe-123k-wdf3-sdfe4_1.jpg 。

                  (7)防止服务器一个存储目录文件数过多造成访问速度下降的问题

                             在 windows 操作系统下,如果一个目录中的文件数超过 1000 就会导致该目录的访问速度下降。为了解决这个问题,大致有两种算法 

                             一:将文件名进行 Base64 编码,首先取得编码后文件名的第一个字母,如果是 a 则存放在 a 目录中,如果是 b 则存放在 b 目录中,以此类推,可以分为 26 个目录存放,26 个目录每个目录存放 1000 个文件,那么可以存放 2.6 万个文件。如果都存满了,那么我们再取出文件名的第二个字母,如果一个文件前两个字母是 ac 那么我们将文件存放在 a 目录下面的 c 目录下,这样每个目录下又有了 26 个子目录,再以此类推 26*1000*26*1000*26*1000……这样存下去,我们可以将世界上的所有文件存放在服务器中,而且保证了服务器中的每个文件夹的文件个数不超过 1000。

                            二:将获取到的文件名进行 hash 运算,可以得到一个 32 位的整数,我们把 32 位整数与 0xF 进行按位与运算,可以得到第一个字节,这个字节可以表示 0-15 之间的任意数字,总共可以表示 16 个数,我们取出这个数作为服务器保存文件的第一个目录,之后我们再将之前的 32 位整数右移 4 位,可以得到第二个字节的 4 个二进制位,之后再与 0xF 位与运算,就得到了第二个 0-15 之间的数,我们用这个数作为二级目录,那么我们现在可以存放的文件总数就是 16*16*1000 如果不够的话,我们可以取出第三个字节,以此类推,我们可以得到足够多的目录来存放文件。

 

 

	public String makeDir(String serverDir, String fileName){
		int hashCode = fileName.hashCode();
		int dir_1 = hashCode&0xf;
		int dir_2 = (hashCode>>4)&0xf;
		String path = serverDir + File.separator + dir_1 + File.separator + dir_2;
		File dir = new File(path);
		if(!dir.exists()){
			dir.mkdirs();
		}
		return path + File.separator + fileName;
	}


                    (8)注意临时文件删除的问题

                             解析器在解析 request 的上传文件时,如果文件大小超过缓冲区的大小,那么将采用临时文件缓存上传文件,如果在执行完上传以后,没有及时删除临时文件,则会导致服务器中保存了两份已上传的文件。所以我们在执行完上传,或者上传异常处理中,应该及时删除临时文件。fileItem.delete()

                     (9)通过监听器实现上传文件进度显示

                              在解析器解析 request 之前,可以通过解析器设置一个监听器 upload.setProgressListener(pListener);(匿名内部类)

package upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet {

	@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(new File("d:/temp"));
		ServletFileUpload upload = new ServletFileUpload(factory);
		if (ServletFileUpload.isMultipartContent(request)) {
			try {
				upload.setProgressListener(new ProgressListener() {

					public void update(long bytesRead, long contentLength,
							int items) {
						System.out.println("文件大小:" + contentLength + "b");
						System.out.println("已上传:" + bytesRead + "b");
					}
				});
				List<FileItem> list = upload.parseRequest(request);
				for (FileItem item : list) {
					if (item.isFormField()) {
						System.out.println("普通字段:" + item.getString());
					} else {
						InputStream in = item.getInputStream();
						String fileName = item.getName();
						String path = makeDir(getServletContext().getRealPath(
								"/WEB-INF/upload"), fileName);
						FileOutputStream fos = new FileOutputStream(path);
						int len = 0;
						byte[] b = new byte[1024];
						while ((len = in.read(b)) != -1) {
							fos.write(b, 0, len);
						}
						fos.close();
					}
				}
			} catch (FileUploadException e) {
				request.setAttribute("message", "上传失败。。");
				request.getRequestDispatcher("/message").forward(request,
						response);
			}
		}
	}

	public String makeDir(String serverDir, String fileName) {
		int hashCode = fileName.hashCode();
		int dir_1 = hashCode & 0xf;
		int dir_2 = (hashCode >> 4) & 0xf;
		String path = serverDir + File.separator + dir_1 + File.separator
				+ dir_2;
		File dir = new File(path);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		return path + File.separator + fileName;
	}

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

}


                 8、实现动态添加删除上传输入项

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <script type="text/javascript">
    	function addInput(){
    		var div = document.createElement("div");
    		
    		var fileInput = document.createElement("input");
    		fileInput.type = "file";
    		fileInput.name="addFile";
    		div.appendChild(fileInput);
    		
    		var delInput = document.createElement("input");
    		delInput.type="button";
    		delInput.value="删除";
    		delInput.onclick=function del(){
    			this.parentNode.parentNode.removeChild(this.parentNode);
    		};
    		div.appendChild(delInput);
    		document.getElementById("files").appendChild(div);
    	}
    </script>
  </head>
  
  <body>
  	<form action="${pageContext.request.contextPath }/servlet/UploadServlet" method="post" enctype="multipart/form-data">
  		上传用户:<input type="text" name="username"><br>
  		<input type="file" name="f"><br>
  		<div id="files">
  		</div>
  		<input type="button" value="添加上传文件" onclick="addInput()"><br>
  		<input type="submit" value="上传"><br>
  	</form>
  </body>
</html>


二、文件下载

package download;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

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

public class ShowList extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		File file = new File(getServletContext().getRealPath("/WEB-INF/upload"));
		Map<String, String> map = new LinkedHashMap<String, String>();
		map = getResource(file, map);
		request.setAttribute("map", map);
		request.getRequestDispatcher("/showlist.jsp").forward(request, response);
	}

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

	public Map<String, String> getResource(File file,Map<String, String> map){
		if(!file.isDirectory()){
			String uuidname = file.getName();
			String realname = uuidname.substring(uuidname.indexOf("_")+1);
			map.put(uuidname, realname);
		}else{
			for (File child : file.listFiles()) {
				getResource(child, map);
			}
		}
		return map;
	}
}

package download;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

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

public class DownLoadServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String path = new String(request.getParameter("id").getBytes("iso-8859-1"), "utf-8");
		String realname = path.substring(path.lastIndexOf("\\") + 1);
		File file = new File(getFilepath(getServletContext().getRealPath(
				"/WEB-INF/upload"), realname));
		realname = file.getName().substring(file.getName().indexOf("_") + 1);
		response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(realname,"utf-8"));
		ServletOutputStream outputStream = response.getOutputStream();
		FileInputStream fis = new FileInputStream(file);
		int len = 0;
		byte[] b = new byte[1024];
		while ((len = fis.read(b)) != -1) {
			outputStream.write(b, 0, len);
		}
		fis.close();
	}

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

	public String getFilepath(String serverPath, String filepath) {
		int hashCode = filepath.hashCode();
		int dir_1 = hashCode & 0xf;
		int dir_2 = (hashCode >> 4) & 0xf;
		String path = serverPath + File.separator + dir_1 + File.separator
				+ dir_2 + File.separator + filepath;
		return path;
	}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  
  <body>
    <c:forEach var="file" items="${requestScope.map}">
    	<c:url var="path" value="/servlet/DownLoadServlet">
    		<c:param name="id" value="${file.key }" />
    	</c:url>
    	${file.value } <a href="${path }">下载</a><br>
    </c:forEach>
  </body>
</html>


Ubuntu终端接入Codex:一行脚本搞定AI编程助手安装与配置 在开发者日常工作中,命令行终端是最高频的操作环境,而AI编程助手的出现正在改变传统的编码方式。通过将大模型能力与终端工具链结合,开发者无需切换窗口即可完成命令查询、代码生成、项目理解和自动执行等任务。Ubuntu作为服务器和开发机的主流系统,搭配Node.js生态和API Key认证,即可在本地闭环运行AI助手。本文从环境准备、密钥配置、权限管理到自动化脚本封装,系统拆解在终端中接入Codex的完整流程,并分享高频用法与实测排障经验,帮助开发者安全、高效地让AI融入命令行工作流。 阅读详情

相关推荐

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3899

大数据WE阶段(十七)文件上传

文件上传一、概述 在web开发中经常需要从客户端向服务端上传文件 , 如: 照片 、 文件 , 这些通常都需要web开发中的文件上传技术实现。 二、 文件上传开发步骤 提供一个带有文件上传项的表单 文件上传的输入框必须有name属性才能被上传 文件上传的表单必须是Post提交 , 因为Get请求对参数的格式有种种限制如:限制大小为4kb , 只能传输简单字符。。。 文件上传的表单必须设置encty

chou_out_man的博客 572

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

JavaWeb实现文件下载的几种方式

JavaWeb实现文件下载的几种方式

追求卓越583的博客 5386

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6871

Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成?

本文详细介绍了在Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成。MCP Server作为大模型与MySQL之间的安全通道,提供权限控制、SSL加密和协议转换功能,显著提升查询性能。文章包含环境配置、安装指南、安全策略及实战案例,帮助开发者高效实现AI与数据库的安全交互。

hill8的博客 720

JavaWeb实现文件下载功能

JavaWeb实现文件下载功能

QQ1602288425的博客 3837

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1146

JavaWeb 文件上传和下载

JavaWeb——文件上传与下载 内容分享。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 4480

【保姆级教程】教你如何轻松获取MIMIC数据使用权限

文章非常详细地介绍了MIMIC数据库申请使用的全部步骤。

越努力 越幸运 6600

Python蓝色跳动的爱心(完整代码)

Python语言实现蓝色跳动的爱心的完整代码。 代码分析 这段代码使用了 库来创建一个动态的爱心图案,并在屏幕上显示带有动态效果的“我爱你”字样。以下是对这段代码的详细分析: 用于创建图形用户界面(GUI)。 用于生成随机数,主要用于控制爱心图案的扩散效果。 中的 , , , 用于数学计算,生成爱心形状和扩散效果。 包含了 等常量,用于控制控件的对齐方式。 2. 全局变量定义 , : 定义画布的大小。 , : 爱心的中心坐标。 : 用于定义爱心形状的缩放

AIGC 1920

JavaWeb文件的上传下载(总结)

文章目录文件的上传下载前述一、文件的上传1、准备工作2、书写步骤2.1 书写表单(jsp)2.2 书写servlet3、commons-fileupload说明3.1 简介3.2 核心类4、示例代码二、文件的下载1、背景2、步骤3、乱码三、一些上传下载的问题解决办法 文件的上传下载 前述 文件的上传和下载在web应用中是非常常用,也是非常有用的功能。 例如:发送电子邮件时可以同过上传附件发送文...

爱码者的博客 1441

Simulink仿真入门到精通(三) Simulink信号

本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。 目录 Simulink仿真入门到精通(一) Simulink界面介绍 Simulink仿真入门到精通(二) Simulink模块 Simulink仿真入门到精通(三) Simulink信号 Simulink仿真入门到精通(四) Simulink子系统 Simulink仿真入门到精通(五) Simulink模型的仿真 Simulink仿真入门到精通(六) Simulink模型保存为图片 Sim

king110108的专栏 5396

javaWeb 文件上传及下载

网络上最常用的就是文件的上传和下载,本文讲解基于org.apache.commons.fileupload包及org.apache.commons.io包实现文件上传;通过设置响应头属性并基于文件流方式实现文件下载。

Mekeater的博客 4240

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Javaweb之文件上传与下载

Javaweb之文件上传与下载 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程。例如目前网站需要上传头像、上传下载图片或网盘等功能都是利用文件上传下载功能实现的。 文件上传下载实际上是两步操作,第一是文件上传,就是将本地文件上传到服务器端,实现文件多用户之间的共享,第二是文件下载,就是将服务器端的文件下载到本地磁盘。 1.2. 文件上传下载实现原理 首先,需要知道文件是如何实现上传及下载的。文件上传及下载实现原理如下: 文

qq_47897078的博客 3061

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

javaweb —— ——文件上传和下载

javaweb —— ——文件上传和下载 文章目录javaweb —— ——文件上传和下载一、如何实现文件上传二、文件上传的相关API1. Fileltem 接口2. DiskFileltemFactory 类3.ServletFileUpload 类实现文件上传实现文件下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需完成两步操作: -是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。接下来,本节将对这两步操作内容进行详细讲解。 由于大多数

weixin_54405545的博客 1849

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Javaweb 文件上传和下载

以上示例展示了如何借助 Apache Commons FileUpload 和 Commons IO 实现一个简洁版的文件上传与下载功能。虽然该实现相对基础,仍有许多可以优化和增强的空间,但它对于理解文件上传下载的核心流程与底层机制具有重要价值。通过这一案例,我们不仅掌握了表单数据的解析、文件流的处理等关键步骤,也为今后使用更高级的框架(如 Spring Boot 中的 Multipart 处理)以及集成第三方对象存储服务(如阿里云 OSS 或 MinIO)打下了扎实的基础。

weixin_43415514的博客 1859

JavaWeb中文件上传与下载

1.设置浏览器端 2.在服务器端操作//设置乱码 upload.setHeaderEncoding(“UTF-8”); 完善细节 1.设置保存上传文件的服务器目录 2.解决上传文件名是中文的问题,通过item.getName()获取到文件的名称 2,方案三:下载电影压缩包,水野朝阳.zip 保留原有的名字 7.获取完整的表单数据 细节: 有复选框的情况怎么办? 8.多文件上传案例 实现多文件的批量上传 Ps:展示图片-“upload” + File.separator + datePath + File

GL280599ZL的博客 1754

Javaweb实现文件上传下载

JavaWeb学习总结——文件上传和下载 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天上课老师讲了文件上传和下载功能的实现,为了便于以后使用做个总结。对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileuplo

专注于全栈开发领域 6980

JavaWeb——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上...

zhangyuliang6430的博客 194

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功

克豪的博客 479

JavaWeb文件上传与下载

JavaWeb文件上传与下载 要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,保存到数据库,然后从数据库拿到路径,进行下载。 上传大多数情况是通过表单的形式提交给服务器,使用标签。 使用标签需要注意以下两点: 1.必须设置name属性,不然浏览器不会发送上传文件的数据。 2.必须将method属性设置为post,ectype属性设置为“multipart/form-data”类型。 from会被分为两部分:表单字段和上传字段,然后

qq_41854180的博客 245

javaWeb文件上传与下载

javaWeb文件上传与下载 理论(原理分析): 文件下载 要获取下载文件的路径 下载的文件名(显示给客户端的文件名) 设置想办法让浏览器能够支持下载我们需要的东西(attachment;filename) 创建文件输入流 创建缓冲区 获取OutputStream对象 将FileOutputStream流写入到buffer缓冲区 使用OutputStream将缓冲区中的数据输出到客户端! @Override protected void doGet(HttpServletRequest req, Htt

Ctrl_kun的博客 297

Javaweb核心之文件上传下载实战

/从输入流中读取数据到缓冲区数组中,如果等于-1代表读完了到末尾了。Web应用系统开发中,文件上传和下载功能是常用的功能,浏览器器在上传的过程中是将。声明该servlet支持mutipart/form-data类型的请求。// 然后把缓冲区数组中的数据写入到输出流中。//web-inf目录外界不能直接访问,如果文件机密性强则放这里。生成一个唯一的随机字符串,确保每次上传的文件名不会冲突。2)需要声明是⼀一个⽂文件上传组件未选择文件选取文件。头部,它包含上传文件的元信息,如文件名。

weixin_67996964的博客 1054

文件上传下载(JavaWeb - SpringMVC - SpringBoot)

1. 文章说明 文件上传在Web项目开发中是一个很重要的功能点,随着技术(框架)的更新变化,不同的技术对文件上传有不同的实现方式。在上传和下载文件的使用操作上,新的技术比旧的技术实现了更便捷(更容易上手)操作方式,这是因为新技术对旧技术进行了更深层次的封装,屏蔽了底层的一些实现细节,但是这也导致我们在使用新技术的时候,大多数时候只是停留在会使用的层面,而不明白这些技术的演变过程和底层实现原理,本篇文章就从传统的JavaWeb 到 SpringMVC 再到SpringBoot实现文件上传的方式做一个总结..

孙小鸿的博客 655

【文件上传和下载教科书】JavaWeb文件上传和下载技术总结

文章目录@[toc]前言一、文件上传1.1 文件上传的核心思想1.2 文件上传中JSP的三要素1.3 上传文件核心jar包1.4 文件上传的细节处理1.4.1 文件名重复覆盖问题1.4.2 使用目录分离算法存储文件1.4.3 文件上传jar包API二、文件下载2.1 文件下载的核心思想2.2 文件下载的两种格式2.3 手动编写代码方式的三要素2.4 文件下载的细节处理2.4.1 解决下载文件后名称...

奈何的人生 1404
上一篇: Java 实现树形结构
下一篇: JavaWeb 过滤器
DriverKing
博客等级 码龄16年 77粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值