最近学到的web阶段的文件的上传,就想记录一下,帮助自己复习以及帮助大家学习,一般我都会把上传的文件存到服务器中的web-inf 下面,因为这样用户不会直接访问到,我们存到数据库的一般都是路径。这里没有演示数据库上传路径,气势上传路径很简单,只需要你把路径和文件名插入到数据库中的某个表就可以了,等你到时候想用找到文件的时候,就从数据库中查找路径就行了。废话不说,上代码(上传文件的servlet,前台界面只需要有一个类型为file的 input标签,如果想一次选上传多个,可以多写几个input或者在input标签内 增加multiple="multiple" 属性,就可以实现一个input中写入好几个文件):

 package practice;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils; public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断表单上传的方式 是否是 multipart/form-data;
boolean ismultipartContent = ServletFileUpload.isMultipartContent(request);
if(!ismultipartContent){
throw new RuntimeException("your form is not multipart/form-data");
}
//创建一个DiskFileItemFactory工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建一个临时文件存储的目录
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if(!tempFile.exists()){
tempFile.mkdir();
}
factory.setRepository(tempFile);
//创建ServletFileUoload 核心对象
ServletFileUpload sfu = new ServletFileUpload(factory);
//解决文件上传乱码问题
sfu.setHeaderEncoding("utf-8");
try {
sfu.setFileSizeMax(1024*1024*3); //单个文件大小
sfu.setSizeMax(1024*1024*6); //总文件大小
//遍历表单集合返回一个List<FileItem>集合
List<FileItem> fileItems = sfu.parseRequest(request);
for(FileItem fileItem:fileItems){
//判断是普通表单还是上传表单
if(fileItem.isFormField()){
//按照普通表单处理
processFormField(fileItem);
}else{
//按照上传表单来处理
processUploadField(fileItem);
}
}
}catch(FileUploadBase.FileSizeLimitExceededException e){
e.printStackTrace();
request.setAttribute("message", "单个文件超出最大值");
request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
return;
}catch(FileUploadBase.SizeLimitExceededException e){
e.printStackTrace();
request.setAttribute("message", "上传文件的总大小超出限制");
request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
return;
}
catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //遍历表单项集合 } //处理上传文件的函数
private void processUploadField(FileItem fileItem) {
//得到上传文件的名字
String filename = fileItem.getName();
//得到文件输入流
try {
InputStream is = fileItem.getInputStream();
//将文件保存在服务器上
String directoryRealPath =this.getServletContext().getRealPath("/WEB-INF/upload");//创建的路径
File storeDirectory = new File(directoryRealPath);
if(!storeDirectory.exists()){
storeDirectory.mkdir(); //创建一个指定目录
}
//处理文件名
//filename =filename.substring(filename.lastIndexOf(File.separator)+1);
if(filename!=null){
filename=FilenameUtils.getName(filename);
}
//不让文件名重复
filename=UUID.randomUUID()+"_"+filename;
//打散目录
String childDirectory = makChildDirectory(storeDirectory,filename); //构建一个完整的文件路径
/*File file =new File(storeDirectory,childDirectory+File.separator+filename);
//创建一个写的流,将图片写入路径
FileOutputStream fos = new FileOutputStream(file);
int len=0;
byte [] buf = new byte[1024];
while((len=is.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
is.close();*/
//用工具类实现文件上传操作
fileItem.write(new File(storeDirectory,childDirectory+File.separator+filename));
fileItem.delete();//删除临时文件
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //打散目录
private String makChildDirectory(File storeDirectory, String filename) {
int hashcode = filename.hashCode();
//把hashcode转换成16进制
String code = Integer.toHexString(hashcode);
String childDirectory = code.charAt(0)+File.separator+code.charAt(1);
File file = new File(storeDirectory,childDirectory);
if(!file.exists()){
file.mkdirs();
}
return childDirectory;
} //处理普通表单的函数
private void processFormField(FileItem fileItem) {
//解决文件名字乱码问题
try {
String fieldName = fileItem.getFieldName(); //获取字段名
//String fieldValue = fileItem.getString(); //获取值
String fieldValue = fileItem.getString("utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);
} }

Java WEB ----- 文件的上传的更多相关文章

  1. java+web文件的上传和下载代码

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...

  2. java客户端文件的上传和下载

    java客户端文件的上传和下载 //上传 public JTable upload(String id){ JTable table=new JTable(); System.out.println( ...

  3. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  4. Java中文件的上传与下载

    文件的上传与下载主要用到两种方法: 1.方法一:commons-fileupload.jar  commons-io.jar apache的commons-fileupload实现文件上传,下载 [u ...

  5. web文件夹上传

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  6. java实现文件的上传与下载

    (一)文件的上传:在这一部分,我要将execl文件的内容上传到数据库中,完成这一功能.需要分为两步: 1:将文件上传到tomcat下 文件格式如下: 2:读取execl表中的内容到数据库中 首先:下载 ...

  7. java大文件分块上传断点续传demo

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

  8. java实现文件夹上传

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  9. java+http文件夹上传

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...

随机推荐

  1. 强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码

    如下是slf4j-api包下的Logger接口类里其中几个方法的声明: package org.slf4j; public interface Logger { /** * Log a message ...

  2. Asp.net Core Mvc EF- Migrations使用

    Migragtion的命令,左边是手动命令,右边是代码方式 首先来看命令方式: 创建一个mvc项目,默认已经集成了EF包 创建的项目包含了Microsoft.AspNetCore.Identity.E ...

  3. 关于SQL视图的创建和使用方法

    SQL视图的创建和使用 视图这个东西在其他的软件中,我们也经常看得到,例如word中就有视图,我们不难发现,视图似乎是一种显示方式,就像WORD一样,有几种显示版面,这就是视图,那么SQL中的视图又该 ...

  4. openresty lua 文件上传与删除

    [1]openresty 上传upload源码库 Github:https://github.com/openresty/lua-resty-upload 源码文件upload.lua文件 [2]上传 ...

  5. 2017-2018-2 20155303『网络对抗技术』Exp2:后门原理与实践

    2017-2018-2 『网络对抗技术』Exp2:后门原理与实践 --------CONTENTS-------- 1. 后门原理与实践实验说明 2. 常用后门工具 NC或netcat Win获得Li ...

  6. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2^k-1. You need t ...

  7. SVN更新的时候前面的子母的意思(A C D M G U R I)

    U:update 表示从服务器收到文件更新了 G:表示本地文件以及服务器文件都已更新,而且成功的合并了 其他的如下: A:add 表示有文件或者目录添加到工作目录 R:replace,从服务器替换,表 ...

  8. ant__property标签的含义与使用

    property标记用于设置属性 属性是键值对,其中每个值都与键相关联,属性用于设置可在构建文件中的任务位置访问的值,设置属性后无法更改 Apache Ant属性类型有两种:内置属性 / 用户定义的属 ...

  9. Python3 tkinter基础 Menubutton 点击按钮出现下拉菜单

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. HTML基础【1】:认识 HTML

    什么是HTML ​ HTML其实是 HyperText Markup Language 的缩写,超文本标记语言 HTML的作用 1.首先利用记事本保存了一个标题和两段描述, 然后修改纯文本文件的扩展名 ...