今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分。不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧。

话不多说,直接开始。

第一步,新建一个空白的web项目。开发工具我还是用的eclipse,我不喜欢用IDEAL。

接下来,编写index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Java文件上传</title>
</head>
<body> </body>
</html>

body里面就简单弄一个上传框了,上传的服务器地址为service/upload.jsp,也就是WebContent目录下,一个叫做service文件夹里面的upload.jsp。

JSP就是Servlet,也就是所谓的服务器程序。它既可以做表现层,也可以做服务层。

代码:

<h1>文件上传</h1>

<h1>文件上传</h1>
<form action="service/upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="文件上传">
</form>

接下来,导入两个jar包,分别是 **common-fileupload-1.2.jar **和 commons-io-2.0.1.jar

第二步,编写文件上传的服务类,也就是服务器端了。(我就直接写JSP了,懒得写Servlet)

先在WebContent目录下增加一个service文件夹,再在里面新建一个upload.jsp。

为了看一下效果,我们再导入一个操作JSON的jar包。

然后,在JSP页面导包:

<%@page import="org.apache.struts2.json.JSONUtil"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.FileItemFactory"%>
<%@page import="java.text.DecimalFormat"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

接下来,要在JSP页面写Java代码,先弄一对尖括号,Java代码就写在里面:

<%

 
%>

01、获取文件上传的真实路径(就是你要把文件保存在项目的什么地方?)

//获取文件的上传的具体目录,就是你的web项目的真实路径
String realPath = request.getSession().getServletContext().getRealPath("/");
//定义上传的目录
String dirPath = realPath+"/upload";
File dirFile = new File(dirPath);

02、如果该路径不存在就自动创建

//自动创建上传的目录
if(!dirFile.exists())dirFile.mkdirs();

我们把上传的文件放在WebContent目录下,也就是项目根路径下的一个叫做upload的文件夹内,如果没有,就自动创建一个。

03、进行上传操作,文件名用UUID

//上传操作
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName = null;
HashMap<String,Object> map = new HashMap<String,Object>();
try{
List items = upload.parseRequest(request);
if(null != items){
Iterator itr = items.iterator();
while(itr.hasNext()){
FileItem item = (FileItem)itr.next();
if(item.isFormField()){
continue;
}else{
fileName = UUID.randomUUID().toString()+getExt(item.getName());
//上传文件的目录
File savedFile = new File(dirPath,fileName);
item.write(savedFile);
map.put("name",item.getName());//文件的重视名称
map.put("size",item.getSize());//文件的真实大小
map.put("sizeString",countFileSize(item.getSize()));//获取文件转换以后的大写
map.put("url","upload/"+fileName);//获取文件的具体服务器的目录
}
}
}
}catch(Exception e){
e.printStackTrace();
}

最后,在新的页面打印文件的具体信息:

out.print(JSONUtil.serialize(map));

辅助函数:

<%!
/**
* 文件大小转换成格式化的字符串
*/
public static String countFileSize(long fileSize) {
String fileSizeString = "";
try {
DecimalFormat df = new DecimalFormat("#.00");
long fileS = fileSize;
if (fileS == 0) {
fileSizeString = "0KB";
} else if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "KB";
} else if (fileS < 1073741824) {
fileSizeString = df
.format(((double) fileS / 1024 / 1024) - 0.01)
+ "MB";
} else {
fileSizeString = df.format((double) fileS / 1024 / 1024 / 1024)
+ "G";
}
} catch (Exception e) {
e.printStackTrace();
}
return fileSizeString;
} /**
* 获取一个文件的后缀(带有点)
*
* @param fileName
* 文件名
* @return 返回文件的后缀
*/
public static String getExt(String fileName) {
int pos = fileName.lastIndexOf(".");
if (pos == -1)
return "";
return fileName.substring(pos, fileName.length());
} /**
* 获取一个文件的后缀(不带有点)
*
* @param fileName
* 文件名
* @return 返回文件的后缀
*/
public static String getExtNoPoint(String fileName) {
if (fileName.lastIndexOf(".") == -1)
return "";
int pos = fileName.lastIndexOf(".") + 1;
return fileName.substring(pos, fileName.length());
}
%>

OK,现在启动tomcat服务器。

没报错。

因为在web.xml里面配置了欢迎页,所以直接访问。

http://localhost/upload

随便上传一张图片,点击文件上传,

报错了,看样子还是缺少jar包。

缺了xwork-core-2.3.15.1.jar 这个包,貌似这两包

是有依赖关系的,其实,这里只是为了把文件信息转成JSON格式,如果你有其他好用的jar包的话,也可以,不一定非要用这两个jar包。

导进去,重启tomcat,上传文件,就OK了。

打印出来的信息:

{"name":"1929342-c2daab1a3c58006d.jpg","sizeString":"564.08KB","url":"upload/b4a08821-3d1a-41e6-b6e4-7985487513b0.jpg","size":577614}

再去发布目录看看

果然,它创建了一个upload文件夹:

图片也成功上传了~

好的,本文就介绍到这里,至于图片的真实路径,一般来说你要保存到数据库里面的。我个人不建议通过IO流的方式直接把图片保存到数据库,如果项目很大,你的数据库动辄几百个G,有点吃不消的。还是把图片放在硬盘上吧,如果要分布式,再另想办法,比如那个ngx啥的。

源码地址:http://pan.baidu.com/s/1b7E1oa

个人博客:http://www.xiaotublog.com/index.html

小兔Java教程 - 三分钟学会Java文件上传的更多相关文章

  1. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. Java基础——Servlet(八)文件上传下载

    一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...

  3. java之Jsch实现Linux的文件上传与下载

    一.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功 ...

  4. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  5. Java 网络编程 -- 基于TCP实现文件上传

    Java TCP 操作基本流程 一.创建服务器 1.指定端口, 使用serverSocket创建服务器 2.阻塞式连接 accept 3.操作:输入流 输出流 4.释放资源 二.创建客户端 1.使用S ...

  6. JAVA整合阿里云OSS实现文件上传功能

    引入maven <dependency> <groupId>org.apache.commons</groupId> <artifactId>commo ...

  7. spring-boot-route(三)实现多文件上传

    Spring Boot默认上传的单个文件大小1MB,一次上传的总文件大小为10MB. 单个文件上传使用MultipartFile参数来接收文件,多文件使用MultipartFile[]数组来接收,然后 ...

  8. SpringMVC(三) RESTful架构和文件上传下载

    RESTful架构 REST全名为:Representational State Transfer.资源表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便,所 ...

  9. 【转】NodeJS教程--基于ExpressJS框架的文件上传

    本文是翻译的一篇文章,原文地址:Handle File Uploads in Express (Node.js). 在NodeJS发展早期上传文件是一个较难操作的功能,随后出现了formidable. ...

随机推荐

  1. 一个免费的、跨平台的、开源音频编辑器Audacity

    Audacity 是一个免费的开源程序,用于编辑音频录制.它可在多个平台(windows/linux)上运行.Audacity 基于 GUI,是一个具有多种选项的强大程序.它支持您录制各种类型的声音. ...

  2. 浅谈WEB页面提速(前端向)

    记得面试现在这份工作的时候,一位领导语重心长地谈道——当今的世界是互联网的世界,IT企业之间的竞争是很激烈的,如果一个网页的加载和显示速度,相比别人的站点页面有那么0.1秒的提升,那也是很大的一个成就 ...

  3. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  4. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  5. 使用HttpClient的优解

    新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工作流畅地看了一遍,接下来就是熟悉框架技术的阶段了. 也正是在看源码的过程当中,有一 ...

  6. css样式之border-radius

    border-radius 属性设置边框的园角 可能的值:像素,百分比 扩展延伸 html代码 <div></div> css代码 div { height: 200px; w ...

  7. osi(open system interconnection)模型的通俗理解

    OSI模型的理解: 以你和你女朋友以书信的方式进行通信为例. 1.物理层:运输工具,比如火车.汽车. 2.数据链路层:相当于货物核对单,表明里面有些什么东西,接受的时候确认一下是否正确(CRC检验). ...

  8. ES6 箭头函数中的 this?你可能想多了(翻译)

    箭头函数=>无疑是ES6中最受关注的一个新特性了,通过它可以简写 function 函数表达式,你也可以在各种提及箭头函数的地方看到这样的观点——“=> 就是一个新的 function”. ...

  9. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  10. 怎样编写高质量的java代码

    代码质量概述     怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友 ...