最近学到的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. 使用PageHelper插件分页结合mybatis返回的列表个数不对问题解决

    问题描述:spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对.比如每页查询10条,返回2条或者3条.r ...

  2. 关于var、let、const的故事

    对于一门编程语言来说,变量与常量是再正常不过的两种,JavaScript是一直解释型的弱类型语言. JavaScript中变量或者常量可以用var.let.const(后两者是ES6的新特性). 1. ...

  3. 0001-20180421-自动化第一章-python基础学习笔记

    ======================学习python==================介绍: python种类: cpython(*),jpython,ironpython,rubypyth ...

  4. ubuntu apache 配置虚拟主机 与 二级域名

    一.ubuntu 配置虚拟主机 方法一:添加端口号 第一步进入 /etc/apache2/sites-available/ 目录,将 000-default.conf 复制一份到当前目录下并重命名,然 ...

  5. Axis2开发WebService客户端 的3种方式

    Axis2开发WebService客户端 的3种方式 在dos命令下   wsdl2java        -uri    wsdl的地址(网络上或者本地)   -p  com.whir.ezoffi ...

  6. <转>jmeter(十八)关联之XPath Extractor

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  7. UI自动化(十一)selenium框架

    框架(提供一个好的解决方案给其他人用) webUi自动化框架 弊端:代码维护难,定位问题复杂,稳定性 PageObject分层:将一个页面抽象成一个类,将这个页面下的可操作性的功能点,当做这个类下的函 ...

  8. AJAX理解

    注:首先我们要明白请求是什么?请求分两种,一.静态请求(如:返回js.css.图片等) 二.动态请求(返回跟用户有关的数据) http(apache.nginx等)服务器会判断如果是一个静态请求,会直 ...

  9. websocket是如何进行建立连接与通信的?(简单理解)

    握手过程: websocket-client端通过ws协议向websocket-server端发起连接请求前,首先在自己的请求头中添加Sec-Websocket-Key键值对,值为根据自己账号通过一定 ...

  10. 在WPF中调用打开文件对话框

    // Create OpenFileDialog Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); ...