• 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;
    	}
    

      

          

  • 相关阅读:
    Intellij IDEA使用restclient测试
    jmeter测试
    Java中String为什么是不可变的
    为什么String类是不可变的?
    反射中getMethods 与 getDeclaredMethods 的区别
    MD5加密
    将long型转换为多少MB的方法
    ContentProvider往通讯录添加联系人和获取联系人
    安卓软件版本更新
    Servlet生命周期与工作原理
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/javaEE_fileUpload.html
Copyright © 2020-2023  润新知