web程序中上传和下载功能的详解

在web程序中上传和下载是两大常用模块

上传可以利用fileupload的包来帮助完成

下载地址为:http://commons.apache.org/fileupload/

此外FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io包, 下载地址为:http://commons.apache.org/io/

那web程序中是如何进行上传的呢?

首先,我们建立一个uploadFile.jsp以供用户上传本地信息。

其中form表单 enctype 属性需要设置为 multipart/form-data,方法必须为post,提交处理的由fileUpload处理

<body>
	<p align="center">请您选择需要上传的文件</p>
	<form id="form1" name="form1" method="post"
		action="fileUpload" enctype="multipart/form-data">
		<table border="0" align="center">
			<tr>
				<td>上传人:</td>
				<td><input name="name" type="text" id="name" size="20">
				</td>
			</tr>
			<tr>
				<td>上传文件:</td>
				<td><input name="file" type="file" size="20">
				</td>
			</tr>
			<tr>
				<td></td>
				<td><input type="submit" name="submit" value="提交"> <input
					type="reset" name="reset" value="重置"></td>
			</tr>
		</table>
	</form>
</body>

上面的页面交由后台的FileUploadServlet处理

public class FileUploadServlet extends HttpServlet {

	private static final long serialVersionUID = -7744625344830285257L;
	private ServletContext sc;
	private String savePath;

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

	public void init(ServletConfig config) {
		// 在web.xml中设置的一个初始化参数
		savePath = config.getInitParameter("savePath");
		sc = config.getServletContext();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//对接受过来的数据设置编码
		request.setCharacterEncoding("UTF-8");
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List<FileItem> items = upload.parseRequest(request);
			Iterator<FileItem> itr = items.iterator();
			while (itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				if (item.isFormField()) {
					System.out.println("表单参数名:" + item.getFieldName()
							+ ",表单参数值:" + item.getString("UTF-8"));
				} else {
					if (item.getName() != null && !item.getName().equals("")) {
						System.out.println("上传文件的大小:" + item.getSize());
						System.out.println("上传文件的类型:" + item.getContentType());
						// item.getName()返回上传文件在客户端的完整路径名称
						System.out.println("上传文件的名称:" + item.getName());

						File tempFile = new File(item.getName());
						// 上传文件的保存路径
						File file = new File(sc.getRealPath("/") + savePath,tempFile.getName());
						item.write(file);
						request.setAttribute("upload.message", "上传文件成功!");
					} else {
						request.setAttribute("upload.message", "没有选择上传文件!");
					}
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("upload.message", "上传文件失败!");
		}
		request.getRequestDispatcher("/uploadResult.jsp").forward(request,
				response);
	}
}

上传以后会跳转到uploadResult.jsp页面

<body>
    ${requestScope['upload.message'] }
    <a href="http://localhost:4848/webExercise/UploadFile.jsp">上传文件</a>
  </body>

最好附上配置文件web.xml

 <servlet>
  <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.qzp.servlet.FileUploadServlet</servlet-class>
    <!--设置初始化参数-->
    <init-param>
     <param-name>savePath</param-name>
     <param-value>uploads</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/fileUpload</url-pattern>
  </servlet-mapping>

  <servlet>
  <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.qzp.servlet.FileDownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/FileDownServlet</url-pattern>
  </servlet-mapping>
  

以上是文件上传的代码,下面我们来介绍文件下载的相关代码

首先如果直接给用户一个链接,以供下载,这样是可行的,但是存在一些不安全的因素,比如暴露了服务器的文件存放的地址

因而,我们采用如下的方法,来进行文件下载

这是文件下载的jsp页面,

<body>
  <%-- 为什么要写在out对象之中呢? 因为直接写在jsp页面中,会暴露服务器的地址 --%>
  <%
  String filename=null;
  session.setAttribute("333.txt",filename);
   //取得文件名
   // filename=getFilepath().substring(mb.getFilepath().lastIndexOf("/")+1);
    out.println("<td><a href=FileDownServlet?filename=333.txt>txt文件</a></td>");//java.rar这个可以改成变量
    out.println("<td><a href=FileDownServlet?filename=a.txt>普通文件</a></td>");
    out.println("<td><a href=FileDownServlet?filename=area.xml>xml配置文件</a></td>");
    out.println("</tr>");
 // }
  %>
  </body>

处理此页面的servlet代码如下

public class FileDownloadServlet extends HttpServlet {
    private static final String CONTENT_TYPE = "text/html; charset=utf-8";

    //Initialize global variables
    public void init() throws ServletException {
    }

    //Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        //得到下载文件的名字
        //String filename=request.getParameter("filename");

        //解决中文乱码问题
        String filename=new String(request.getParameter("filename").getBytes("iso-8859-1"),"utf-8");

        //创建file对象
        File file=new File("this.getServletContext().getRealPath("/")+"uploads/"+filename);

        //设置response的编码方式
        response.setContentType("application/x-msdownload");

        //写明要下载的文件的大小
        response.setContentLength((int)file.length());

        //设置附加文件名
       // response.setHeader("Content-Disposition","attachment;filename="+filename);

        //解决中文乱码
    response.setHeader("Content-Disposition","attachment;filename="+new String(filename.getBytes("utf-8"),"iso-8859-1"));       

        //读出文件到i/o流
        FileInputStream fis=new FileInputStream(file);
        BufferedInputStream buff=new BufferedInputStream(fis);

        byte [] b=new byte[1024];//相当于我们的缓存

        long k=0;//该值用于计算当前实际下载了多少字节

        //从response对象中得到输出流,准备下载

        OutputStream myout=response.getOutputStream();

        //开始循环下载

        while(k<file.length()){

            int j=buff.read(b,0,1024);
            k+=j;

            //将b中的数据写到客户端的内存
            myout.write(b,0,j);

        }

        //将写入到客户端的内存的数据,刷新到磁盘
        myout.flush();

    }

    //Process the HTTP Post request
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        doGet(request, response);
    }

    //Clean up resources
    public void destroy() {
    }
}

最后贴上上传和下载页面的效果图

上传文件的效果图:

下载文件的效果图:

时间: 2024-10-16 09:18:09

web程序中上传和下载功能的详解的相关文章

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

Libcurl最初的实现tfp上传和下载功能

研究报告指出的目标是使用libcurl实现ftp文件上传和下载功能 一.Libcurlde简要 Libcurl的而且易于使用的利用url进行文件传输的库. , libcurl当前支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP,LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP协议.libcurl相同支持HTTPS证书授权,HT

web开发上传和下载(转)

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

使用ssh开发rest web服务支持http etag header的教程详解

原创整理不易,转载请注明出处:使用ssh开发rest web服务支持http etag header的教程详解 代码下载地址:http://www.zuidaima.com/share/1777391667989504.htm 导言 REST方式的应用程序构架在近日所产生的巨大影响突出了Web应用程序的优雅设计的重要性.现在人们开始理解"WWW架构"内在的可测量性及弹性,并且已经开始探索使用其范例的更好的方式.在本文中,我们将讨论一个Web应用开发工具--"简陋的.卑下的&q

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

IOS-TextField功能方法详解

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBord

HP电脑的增霸卡功能操作详解

机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还原模式,模式有:(不保护.每次.周.月.),选择不保护:(如果第四步可操作,则省略这一步操作) 4).光标切换到>>>磁盘工具,选择要进行操作的系统的启动盘,选择保护模式,模式有:(保护.不保护),选择"不保护":(如果保护模式不可操作,则进行第三步操作) 5).保存,重

Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解

说明:Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解,加密算法,是现在每个软件项目里必须用到的内容. 广泛应用在包括了用户登入.数字签名.数据传输等多个场合.今天我把常见的加密算法全部整理在这里,供大家学习参考. 首先,大家要知道加密算法能干什么,利用加密算法来对数据通信的过程进行加密传输是一种最常见的安全手段.利用该手段能够达到一下三个目的: 1.数据保密性,防止用户数据被窃取或泄露: 2.数据完整性,防止用户传输的数据被篡改: 3.通信双方身份确认,确保数据来源合法: 常见

JavaWeb中的文件上传和下载功能的内容就这么多

一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件上传页面和消息提示页面 upload.jsp页面的代码如下: 1<%@ page language="java" pageEncoding="UTF-8"%> 2<!DOCTYPE HTML> 3<html> 4<head>