day24(JAVAWEB上传与下载)

javaWeb上传与下载

    上传:

      上传方式:

          jspSmartUpload   :应用在jsp上的文件上传与下载组件。

          FileUpload            :用用在jaava环境上的上传的功能

          Servlet3.0           :提供了文件上传功能

          Struts2                   :提供文件上传的功能

    这里主要讲述FileUpload上传和下载

        上传三要素:

          1.提交的方式必须是post(因为get提交的内容大小是有限制的)

          2.表单中需要有<input type=”file”>元素,需要有name属性和值。

          3.表单enctype=”multipart/form-data”。 

        测试页面:

<form action="提交地址" method="post" enctype="multipart/form-data">
  <input type="text" name="info"/></br>
  <input type="file" name="filename"/>
  <input type="submit" value="上传"/>
</form>

        使用servlet来接收上传过来的文件项

          1.导包

            commons-fileupload-1.2.1.jar

            commons-io-1.4.jar

          2.编写servlet来接收

          

package com.baidu.upload;

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

public class FileUploadServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//获取磁盘工厂
			DiskFileItemFactory dfif=new DiskFileItemFactory();
			//获取核心类
			ServletFileUpload sfu=new ServletFileUpload(dfif);
			//对核心类对象进行编码,  解决了文件名字中的乱码
			sfu.setHeaderEncoding("UTF-8");
			//获取提交参数集合(每一个表单项FileItem)
			List<FileItem> list = sfu.parseRequest(request);
			for (FileItem fileItem : list) {
				//判断是否是普通项
				if (fileItem.isFormField()) {
					//普通项
					String name = fileItem.getName();
					String value = fileItem.getString("UTF-8");
					System.out.println(name+" "+value);
				} else {
					//文件项
					//获取文件的名字
					String fieldName = fileItem.getName();
					//设置服务器存储路径
					String dir="C:\Users\Administrator\Desktop\develop";
					//使用文件项流进行流的对接
					fileItem.write(new File(dir,fieldName));
					fileItem.delete();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

      文件的下载

          下载的方式:自动下载和手动下载

            自动下载:使用超链接的方式实现文件的下载

               在<a href=”文件的路径”>超链接</a>

             注意:超链接的方式,如果浏览器不能识别这种格式的文件,提示下载,如果支持该格式的文件,直接打开。

            手动下载:设置两头一流

                Context-Type    :文件类型MIME。

                Context-Disposition :浏览器支持该格式文件下载,提示下载。

                输出流                           :设置代表该文件的输入流(输出流是固定 response.getOutputStream())

package com.baidu.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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;

import com.baidu.utils.DownloadUtils;


public class FileDownloadServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收参数
		String filePath = request.getParameter("path");
          //对接收来的数据进行重新编码 String fileName = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8"); String file=filePath+"\"+fileName; //设置两头一流Content-type Content-disposition 文件输出流 String type = getServletContext().getMimeType(file);
          //设置响应头部的类型 response.setContentType(type); response.setHeader("Content-Disposition", "attachment;filename="+file); //获取浏览器的类型 //String header = request.getHeader("User-Agent"); //if ("Firefox".equalsIgnoreCase(header)) { //file = DownloadUtils.base64EncodeFileName(file); //} else { //file = URLEncoder.encode(file,"UTF-8"); //}
          //获取输入流对象 把要下载的文件作为输入流对象参数 InputStream ips=new FileInputStream(file);
          //获取响应输出流对象 响应为页面 ServletOutputStream outputStream = response.getOutputStream(); int len=0; byte[] bt=new byte[1024*1024*3]; while((len=ips.read(bt))!=-1){ outputStream.write(bt, 0, len); } ips.close(); outputStream.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

   使用Struts2文件上传

private File file;	//对应前台的file的name属性
	private String fileContentType;	//对应File+ContextType
	private String fileFileName;	//对应File+FileName;
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public String getFileContentType() {
		return fileContentType;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
	public String getFileFileName() {
		return fileFileName;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public String execute(){
		try {
			FileUtils.copyFile(file, new File("E:/server",fileFileName));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SUCCESS;
	}

  配置文件

<action name="upload" class="com.baidu.web.action.UploadAction" method="execute">
			<result name="success">/success.jsp</result>
			<!-- 配置上传文件监听器 -->
			<interceptor-ref name="fileUpload">
				<!-- 配置上传文件的大小 -->
				<param name="maximumSize"></param>
				<!-- 上传文件扩展名 -->
				<param name="allowedExtensions">bmp,txt,xml,doc,java</param> <!-- 设置上传文件允许的后缀名,多个使用逗号分开 -->
				<!-- 配置上传文件的类型 -->
				<param name="allowedTypesSet">application/java</param>
				
			</interceptor-ref>
			<interceptor-ref name="defaultStack"/>
		</action>

  

 多文件上传

  

private File[] file;	//对应前台的file的name属性
	private String[] fileContentType;	//对应File+ContextType
	private String[] fileFileName;	//对应File+FileName;
	
	public File[] getFile() {
		return file;
	}

	public void setFile(File[] file) {
		this.file = file;
	}

	public String[] getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(String[] fileContentType) {
		this.fileContentType = fileContentType;
	}

	public String[] getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String[] fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String execute(){
		try {
			for (File f : file) {		
			}
			for (int i = 0; i < file.length; i++) {
				FileUtils.copyFile(file[i], new File("E:/server",fileFileName[i]));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SUCCESS;
	}

  

      

原文地址:https://www.cnblogs.com/fjkgrbk/p/javaEE_fileUpload.html