小兔Java教程 - 三分钟学会Java文件上传

Paste_Image.png

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

话不多说,直接开始。

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

1481256199097048746.png

接下来,编写index.jsp

1481256242785087927.png

<%@ 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

1481256577613028258.png

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

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

1481256733535012389.png

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

1481257463144034558.png

然后,在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服务器。

1481257995441086413.png

没报错。

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

http://localhost/upload

1481258089816075458.png

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

1481258548269004945.png

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

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

1481258696566000776.png

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

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

打印出来的信息:

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

再去发布目录看看

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

1481258814488031118.png

图片也成功上传了~

1481258843926058617.png

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

Linux用户管理

4660
来自专栏Eugene's Blog

php文件包含漏洞分类目录文章标签友情链接联系我们

1572
来自专栏步履前行

Spring Retry

  在我们的业务场景中,经常要调用其他的API来获取信息,比如我们的业务场景需要依赖个人信息来处理,这个时候调用个人信息服务的API,但是由于可能同一时段多方在...

4113
来自专栏北京马哥教育

29 条运维工程师必会实用 Linux 命令

虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单...

3219
来自专栏编码小白

ofbiz初级教程

本教程是ofbiz 基本应用,它涵盖了OFBiz应用程序开发过程的基本原理。目标是使开发人员熟悉最佳实践,编码惯例,基本控制流程以及开发人员对OFBiz定制所需...

1.8K3
来自专栏aoho求索

Spring Cloud Bus中的事件的订阅与发布(二)

在之前的文章Spring Cloud Bus中的事件的订阅与发布(一)介绍了消息总线的相关事件。本文主要介绍消息总线的事件监听器以及消息的订阅与发布。 事件监听...

4647
来自专栏北京马哥教育

惊心动魄,Linux被死锁阵痛后的破门实录

Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。

1452
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb20-文件上传;下载(Java真正的全栈开发)

文件上传&下载一.文件上传 1. 文件上传介绍 要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就...

3476
来自专栏CSDN技术头条

SpringBoot 核心模块原理剖析

微服务始终一个相对热门的话题,SpringBoot 则以其轻量级、内嵌 Web 容器、一键启动、方便调试等特点被越来越多的微服务实践者所采用。 知其然还要知其所...

4549
来自专栏Young Dreamer

Vue Router的懒加载路径

1881

扫码关注云+社区

领取腾讯云代金券