Java开发系列-文件上传
概述
Java开发中文件上传的方式有很多,常见的有servlet3.0、common-fileUpload、框架。不管哪种方式,对于文件上传的本质是不变的。
文件上传的准备
文件上传需要客户端跟服务都有必须的规定,跟普通的post表单提交不太一样。
客户端的要求
- 首先请求的方式必须是
Post请求。 - 以往我们通过表单提交普通数据用的组件,比如input类型text、checkbox、password等这些我们称之为
普通上传组件。对于文件上传使用的组件必须是
<input type="file" name=""> - 对于表单必须添加属性
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开发系列-文件上传的更多相关文章
- Java开发之文件上传
文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...
- iOS开发系列-文件上传
概述 Http协议对文件上传协议要求的 1. 必须设置请求头Content-Type为multipart/form-data.在iOS中后面需要跟上分隔符比如:boundary=----WebKitF ...
- 【Java】JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- Java中实现文件上传下载的三种解决方案
第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...
- Java下载https文件上传到阿里云oss服务器
Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- Web 开发中 文件上传 是出现的:java.io.FileNotFoundException: (文件名、目录名或卷标语法不正确。)
<span style="font-family: Arial, Helvetica, sans-serif; "> </span> <span st ...
随机推荐
- mui与springMVC前后端分离
这个小dome简单来说的前后端分离,通过跨域调用接口来显示数据. 前端用到mui框架,主要来显示数据. 后端用到Java的springMVC,restful服务来做增删改查管理, 这里主要实现动态显示 ...
- Python 爬取赶集网租房信息
代码已久,有可能需要调整 #coding:utf-8 from bs4 import BeautifulSoup #有这个bs4不用正则也可以定位要爬取的内容了 from urlparse impor ...
- .net 项目如何添加log4net日志记录
1.在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度. 文件实例: <?xml version="1.0"?><configura ...
- 51nod 1627 瞬间移动(组合数学)
传送门 解题思路 因为每次横纵坐标至少\(+1\),所以可以枚举走的步数,枚举走的步数\(i\)后剩下的就是把\(n-1\)与\(m-1\)划分成\(i\)个有序正整数相加,所以用隔板法,\(ans= ...
- [JZOJ 5861] 失意
思路: 求交集最大老套路,排序之后用堆维护即可. #include <bits/stdc++.h> using namespace std; const int mod = 1e9+7; ...
- GO语言range的用法 (2013-08-09 14:08:26)
range是go语言系统定义的一个函数. 函数的含义是在一个数组中遍历每一个值,返回该值的下标值和此处的实际值. 假如说a[0]=10,则遍历到a[0]的时候返回值为0,10两个值. 下面是一个例子: ...
- 转:这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。
http://www.cnblogs.com/gmh915/archive/2009/09/30/1576995.html 这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的.供 ...
- Unity NGUI 粒子的排序
Unity NGUI系统中是没有对粒子进行排序的,如: 怎么解决这个问题呢? 思路是把粒子的渲染层级,相对于UI组件的层级进行一个偏移. 解决后的效果如下: 代码如下: using System.Co ...
- Linux下core文件调试
1,ulimit -a查看默认参数 2,ulimit -c 1024 设置core文件大小,如果超过1024个blocks,则不会产生core文件 注:tune2fs -l /dev/sda8 输出分 ...
- netty 文件传输
FileServer package com.zhaowb.netty.ch13_1; import io.netty.bootstrap.ServerBootstrap; import io.net ...