概述

Java开发中文件上传的方式有很多,常见的有servlet3.0、common-fileUpload、框架。不管哪种方式,对于文件上传的本质是不变的。

文件上传的准备

文件上传需要客户端跟服务都有必须的规定,跟普通的post表单提交不太一样。

客户端的要求

  1. 首先请求的方式必须是Post请求。
  2. 以往我们通过表单提交普通数据用的组件,比如input类型text、checkbox、password等这些我们称之为普通上传组件。对于文件上传使用的组件必须是

    <input type="file" name="">
  3. 对于表单必须添加属性 enctype="multipart/form-data"

服务端要求

在Servlet3.0中,接受文件上传组件的数据不再是通过request.getParameter(),而是通过request.getPart

// 获取上传组件
Part part = request.getPart("f");
// 获取文件上传的文件二进制数据
InputStream inputStream = part.getInputStream();

文件上传技术实现方式

Servlet3.0文件上传

在Servlet3.0中,提供了一个注解@MultipartConfig,当Servlet添加该注解后才可在接受到Post请求通过request.getPart()获取到文件组件的Port对象,否则取值为nil。

具体的文件上代码

package com.coderhong.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; import org.apache.commons.io.IOUtils; @WebServlet("/upload")
@MultipartConfig
public class ServletDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username");
System.out.println(username); // 获取上传组件
Part part = request.getPart("f");
System.out.println(part); // 获取文件名
String dis = part.getHeader("Content-Disposition");
//System.out.println(header); // // form-data; name="f"; filename="Desert.jpg"
String prefStr = "filename=";
String fileName = dis.substring(dis.indexOf(prefStr)+prefStr.length()+1, dis.length()-1); // 获取项目路径
String projPath = request.getServletContext().getRealPath("/upload/");
File file = new File(projPath);
if(!file.exists()){
file.mkdirs();
} // 获取文件上传的文件二进制数据
InputStream inputStream = part.getInputStream();
// 流拷贝存储文件到目标目录
OutputStream os = new FileOutputStream(new File(projPath, fileName));
IOUtils.copy(inputStream, os);
// 释放流资源
os.close();
inputStream.close();
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

common-fileUpload文件上传

使用common-fileUpload文件上传需要先导入jar包。

Servlet中实现代码:

package com.coderhong.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils; public class UpLoadServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); try {
List<FileItem> list = servletFileUpload.parseRequest(request); for (FileItem fileItem : list) {
// 判断普通组件还是文件上传组件
if(fileItem.isFormField()){ // 普通上传组件
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8"); System.out.println("name="+name+" "+"vaue="+value);
}else{ // 文件上传组件
// 获取name属性
String name = fileItem.getFieldName();
// 获取文件名称
String fieldName = fileItem.getName();
// 获取文件内容
InputStream inputStream = fileItem.getInputStream(); // 设置存储文件存放路径(注意目录必须是存在的)
String realPath = this.getServletContext().getRealPath("/products/"); // 生成唯一的文件名称
String fileName = UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(fieldName);
fileItem.write(new File(realPath, fileName)); System.out.println("name="+name+" "+"fileName="+fieldName);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
} }

Java开发系列-文件上传的更多相关文章

  1. Java开发之文件上传

    文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...

  2. iOS开发系列-文件上传

    概述 Http协议对文件上传协议要求的 1. 必须设置请求头Content-Type为multipart/form-data.在iOS中后面需要跟上分隔符比如:boundary=----WebKitF ...

  3. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  4. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  5. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  6. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  7. Java下载https文件上传到阿里云oss服务器

    Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...

  8. java+web+大文件上传下载

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  9. Web 开发中 文件上传 是出现的:java.io.FileNotFoundException: (文件名、目录名或卷标语法不正确。)

    <span style="font-family: Arial, Helvetica, sans-serif; "> </span> <span st ...

随机推荐

  1. NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_curve.h> #include <u ...

  2. linux centos 安装配置varnish

    安装2.0+版本 前期准备: 下载pcre http://sourceforge.net/projects/pcre/files/pcre/ http://optimate.dl.sourceforg ...

  3. Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表

    本代码目的是替代Oracle的connect by语句,并实现后者的path和idleaf功能. 正文开始: 假设表org,字段有 id(编号),name(名称),pid(上级编号), 最上级的记录p ...

  4. postgres优化项及linux上pg操作记录

    1.linux切换到pg命令: $ su - postgres $ psql postgres=# 2.查看/退出pg ps -ef |grep postgres postgres=# \q 3.一般 ...

  5. Java学习之JVM、JRE、JDK联系与区别

    JVM,全称是Java Virtual Machine,翻译为Java虚拟机: JRE,全称是Java Runtime Environment,翻译为Java运行时环境: JDK,全称是Java De ...

  6. 2018湘潭大学程序设计竞赛【C】

    题目链接:https://www.nowcoder.com/acm/contest/105/C 题意:给你几个矩形的左上角和右下角的坐标,让你算有几个矩形相交. 题解: 每次都暴力标记一下炸弹区域里的 ...

  7. springcloud(十六):服务网关 zuul 快速入门

    服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...

  8. java 3des加密问题记录

    3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了 首先对于密钥的生成,java中有2种方式: 1.第一种,采用ECB模式和不填充模式 ...

  9. iOS进阶五-RunLoop

    简介 RunLoop 运行循环.跑圈 RunLoop的作用主要体现在三方面: 1.保持程序持续运行 2.处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3.节省CPU资源,提 ...

  10. Flask扩展 -- flask-mail

    电子邮件是最常用的通信方式之一.虽然Python标准库中的smtplib包可用在Flask程序中发送电子邮件,但包装了smtplib的Flask-Mail扩展能更好的和Flask集成. 1.安装Fla ...