最近学到的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. [pat]1068 Find More Coins

    满背包问题,把体积和价值看成相等的.用滚动数组优化,然后额外开辟一个choice数组来记录每次的选择,然后回溯打印.因为要按字典序,先把价值进行排序.假如选最小的商品能装满m的话,那就把判断条件改成大 ...

  2. iPhoneX快速适配,简单到你想哭。

    研究了5个小时的iPhoneX适配. 从catalog,storyboard,safearea等一系列文章中发现.如果我们想完全撑满全屏.那直接建一个storyboard就好了.但撑满全屏后,流海就是 ...

  3. Chrome调试WebView时Inspect出现空白的解决方法(使用离线包不Fan墙)

    起因 使用HTML5开发Android应用时,少不了调试WebView.做前端的还是习惯Chrome的开发者工具,以前都是输入Chrome://inspect就可以调试WebView了,太方便了. 最 ...

  4. 为archlinux终端ls不同类型文件设置不同显示颜色

    title: 为archlinux终端ls不同类型文件设置不同显示颜色 date: 2017-11-13 20:53:55 tags: linux categories: linux archlinu ...

  5. rsync 远程同步 实时同步备份 两种免交互的方式实现实时备份

    rsync 远程同步: 一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH.rsync主机同步 作用:做数据备份 备份方式:      完全备份      增量备份 ...

  6. Zuul 网关路由

    Zuul 网关路由 路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务. Zuul是一个基于JVM的路由和服务端的负载均衡器.Zuul ...

  7. SQL SEVER 的基本请求指令

    SQL分类:DDL--数据定义语言(create,alter,drop,declare) DML--数据操纵语言(select,delete,update,insert) DCL--数据控制语言(gr ...

  8. Linux分区、文件系统

    Linux分区类型: ◆主分区:总共最多只能分四个 ◆扩展分区:只能有一个,也算作主分区的一种,也就是 说主分区不能存储数据和格式化,必须再划分为逻辑分区才能使用. ◆逻辑分区:逻辑分区是在扩展分区中 ...

  9. Dvelopment descriptor

    部署描述符是JavaEE程序常见的一部分,但是之前都没有较为全面的学习过,这里就较为全面的记录一下部署描述符中的元素.部署一个Servlet 3 或以上应用程序是一件轻而易举的事.通过Servlet注 ...

  10. javax.el.PropertyNotFoundException: Property 'know_id' not found on type java.lang.String

    今天通过Servlet明明查出来了结果,在跳转到页面时报这个异常.根据经验仔细核对了字段书写时,未发现错误. 耐心仔细检查之后发现el表达式的List集合写错了 <c:forEach items ...