1.普通基于IO流和form表单选择文件上传文件
package com.Struts.xql.Action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* @category 文件上传Controller控制层
* @author 许清磊
*
*/
public class UploadFileAction extends ActionSupport {
/**
* 零散数据收参
*/
private File file1;
private String file1FileName;
private String wenjianName;
/**
* 定义程序序列化ID
*/
private static final long serialVersionUID = 1L;
/**
* @category 文件上传控制
* @return
* @throws Exception
*/
public String upLoadFile(){
System.out.println(file1);
/**
* 先根据位置输入流JVM
* 读多少字节写多少字节输出流在指定位置
* 注意情况缓冲区和关流
*/
OutputStream os = null;
InputStream is = null;
try{
is = new FileInputStream(file1);
String realpath = ServletActionContext.getServletContext().getRealPath("\\Upload");
File lastname = new File(realpath);
//判断文件夹是否存在
//测试此抽象路径名表示的文件或目录是否存在
if(!lastname.exists()){
lastname.mkdir();//创建此抽象路径名指定的目录。
//返回值boolean 继续细节处理是否成功创建
}
os = new FileOutputStream(realpath+"\\"+file1FileName);
byte[] b = new byte[1024];
while(true){
int read = is.read(b);
if(read==-1) break;
os.write(b,0,read);
}
}catch(IOException e){
e.printStackTrace();
return null;//return到错误页面
}finally{
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
return null;//return到错误页面
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
return null;//return到错误页面
}
}
}
return null;
}
存在问题:1.上传文件重名会被覆盖
2.文件上传的大小
3.代码冗余太大 不方便 解决方案可以封装成工具类
2.基于框架和jar包中写上传
解决代码冗余琐碎的问题 直接使用别的工具类jar包
/**
*
* @return 上传成功返回页面 我这里为空 根据自己需求自定义
*/
public String upLoadFile2(){
String realPath = ServletActionContext.getServletContext().getRealPath("\\Upload");
File destFile = new File(realPath+"\\"+file1FileName);
try {
//FileUtils工具类 第一个参数源文件类型private File file1; 第二个参数上传的位置和名字
FileUtils.copyFile(file1, destFile);
} catch (IOException e) {
e.printStackTrace();
return null;//错误页面
}
return null;
}
存在问题:1.上传文件重名会被覆盖
2.文件上传的大小
3.完美版上传单个文件
/**
* @category 解决上传文件重名问题加了UUID和当前日期拼接以及文件后缀
* 上传的路径 以及 是否存在文件夹实现创建
* @return
*/
public String upLoadFile3(){
System.out.println(file1);
String realPath= ServletActionContext.getServletContext().getRealPath("/");
File realPathFile = new File(realPath);
//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
//加上文件名字
File lastname = new File(parent+wenjianName);
//判断文件夹是否存在
//测试此抽象路径名表示的文件或目录是否存在
if(!lastname.exists()){
lastname.mkdir();//创建此抽象路径名指定的目录。
//返回值boolean 处理
}
//文件夹命名加UUID和当前时间拼接
String ud = UUID.randomUUID().toString();//获取String类型字符id
String newud = ud.replace("-", "");//去掉斜杠
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
String newdate = format.replace("-", "");//去掉斜杠
System.out.println(newdate);
//上传文件后缀
String[] filenamesz = file1FileName.split("\\.");
String houzhui = filenamesz[filenamesz.length-1];
//为了0风险吧前面的全部拼接
StringBuilder sb =new StringBuilder();
for(int i=0;i<filenamesz.length-1;i++){
sb.append(filenamesz[i]);
}
String lastfilename = sb.append(newud).append(newdate).append(".").append(houzhui).toString();
File inputname = new File(lastname,lastfilename);
try {
FileUtils.copyFile(file1, inputname);
} catch (IOException e) {
e.printStackTrace();
return null;//异常处理
}
return null;
}
public File getFile1() {
return file1;
}
public void setFile1(File file1) {
this.file1 = file1;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public String getFile1FileName() {
return file1FileName;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public String getWenjianName() {
return wenjianName;
}
public void setWenjianName(String wenjianName) {
this.wenjianName = wenjianName;
}
3.如何将文件保存到服务器的某个位置。
注意事项如果是struts收参数
4多个文件上传
其实多文件上传和单文件上传原理一样,单文件上传过去的是单一的File,多文件上传过去的就是一个List集合或者是一个File[]数组,首先我们来看一下前端jsp部分的代码,这里我用到了jquery来实现动态的添加文件下载框以及动态的删除下载框:
<script type="text/javascript" src="script/jquery-1.8.1.js"></script>
<script type="text/javascript">
$(function()
{
$("#button").click(function()
{
var html = $("<input type='file' name='file'>");
var button = $("<input type='button' name='button' value='删除'><br>");
$("#body div").append(html).append(button);
button.click(function()
{
html.remove();
button.remove();
})
})
})
</script>
</head>
<body id="body">
<form action="fileUpload2.action" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
file: <input type="file" name="file">
<input type="button" value="添加" id="button"><br>
<div></div>
<input type="submit" value="submit">
</form>
</body>
public class FileUploadAction2 extends ActionSupport
{
private String username;
//这里用List来存放上传过来的文件,file同样指的是临时文件夹中的临时文件,而不是真正上传过来的文件
private List<File> file;
//这个List存放的是文件的名字,和List<File>中的文件相对应
private List<String> fileFileName;
private List<String> fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public List<File> getFile()
{
return file;
}
public void setFile(List<File> file)
{
this.file = file;
}
public List<String> getFileFileName()
{
return fileFileName;
}
public void setFileFileName(List<String> fileFileName)
{
this.fileFileName = fileFileName;
}
public List<String> getFileContentType()
{
return fileContentType;
}
public void setFileContentType(List<String> fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
for(int i = 0; i < file.size(); i++)
{
//写第三部分单个上传的代码
}
return SUCCESS;
}
}
简单工具类
package com.dangdang.xql.util;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
/**
* @category 上传工具类
* @author 许清磊
*
*/
public class UploadUtil {
/**
* @category 返回数据库存储路径的名字 自己手动拼接文件名
* 解决上传文件重名问题加了UUID和当前日期拼接以及文件后缀
* 上传的路径 以及 是否存在文件夹实现创建
* @param bookCover
* @param bookCoverFileName
* @param wenjianName
* @return
*/
public static String getBookCover(File bookCover,String bookCoverFileName,String wenjianName){
String realPath= ServletActionContext.getServletContext().getRealPath("/");
File realPathFile = new File(realPath);
//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
//加上文件名字
File lastname = new File(parent+wenjianName);
//判断文件夹是否存在
//测试此抽象路径名表示的文件或目录是否存在
if(!lastname.exists()){
lastname.mkdir();//创建此抽象路径名指定的目录。
//返回值boolean 处理
}
//文件夹命名加UUID和当前时间拼接
String ud = UUID.randomUUID().toString();//获取String类型字符id
String newud = ud.replace("-", "");//去掉斜杠
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
String newdate = format.replace("-", "");//去掉斜杠
System.out.println(newdate);
//上传文件后缀
String[] filenamesz = bookCoverFileName.split("\\.");
String houzhui = filenamesz[filenamesz.length-1];
//为了0风险吧前面的全部拼接
StringBuilder sb =new StringBuilder();
for(int i=0;i<filenamesz.length-1;i++){
sb.append(filenamesz[i]);
}
String lastfilename = sb.append(newud).append(newdate).append(".").append(houzhui).toString();
return lastfilename;
}
/**
* 数据库存储成功上传文件
* @param bookCover
* @param bookCoverFileName
* @param wenjianName
* @param lastfilename 上传文件命名
*/
public static void UploadFile(File bookCover,String bookCoverFileName,String wenjianName,String lastfilename){
String realPath= ServletActionContext.getServletContext().getRealPath("/");
File realPathFile = new File(realPath);
//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
//加上文件名字
File lastname = new File(parent+wenjianName);
//判断文件夹是否存在
//测试此抽象路径名表示的文件或目录是否存在
if(!lastname.exists()){
lastname.mkdir();//创建此抽象路径名指定的目录。
//返回值boolean 处理
}
File inputname = new File(lastname,lastfilename);
try {
FileUtils.copyFile(bookCover, inputname);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* @category 删除图片 或者修改删除图片
* @param list
*/
public static void delete(List<String> list){
String realPath = ServletActionContext.getServletContext()
.getRealPath("/");
File realPathFile = new File(realPath);
// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
List<File> file = new CopyOnWriteArrayList<>();
// 遍历拼接路径
for (String s : list) {
File f = new File(parent + s);
file .add(f);
}
for (File f : file) {
System.out.println(f);
f.delete();// 这里我们马上删除
/**
* delete() : 这个方法能够删除 File 所代表的文件或者文件夹。 deleteOnExit() :
* 这个方法也能用来删除文件或者文件夹。所不同的是, delete()方法被调 用时,这个文件或者文件夹会被立刻删除, 而
* deleteOnExit()方法被调用后,文件或者文件 夹并不会立刻被删除, 而会等到程序退出以后再删除。
*/
}
}
}
删除图片
String realPath = ServletActionContext.getServletContext()
.getRealPath("/");
File realPathFile = new File(realPath);
// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
List<File> file = new CopyOnWriteArrayList<>();
// 遍历拼接路径
for (String s : list) {
File f = new File(parent + s);
file.add(f);
}
for (File f : file) {
System.out.println(f);
f.delete();// 这里我们马上删除
/**
* delete() : 这个方法能够删除 File 所代表的文件或者文件夹。 deleteOnExit() :
* 这个方法也能用来删除文件或者文件夹。所不同的是, delete()方法被调 用时,这个文件或者文件夹会被立刻删除, 而
* deleteOnExit()方法被调用后,文件或者文件 夹并不会立刻被删除, 而会等到程序退出以后再删除。
*/
}
SpringMVC上传工具类
package com.dangdang.lsl.util;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;
/**
* @category 上传工具类
* @author 许清磊
*
*/
public class UploadUtil {
/**
* @category 返回数据库存储路径的名字 自己手动拼接文件名
* 解决上传文件重名问题加了UUID和当前日期拼接以及文件后缀
* 上传的路径 以及 是否存在文件夹实现创建
* @param bookCover
* @param bookCoverFileName
* @param wenjianName
* @return
*/
public static String getBookCover(MultipartFile bookCover,String bookCoverFileName,String wenjianName,HttpServletRequest request){
String realPath= request.getServletContext().getRealPath("/");
File realPathFile = new File(realPath);
//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
//加上文件名字
File lastname = new File(parent+wenjianName);
//判断文件夹是否存在
//测试此抽象路径名表示的文件或目录是否存在
if(!lastname.exists()){
lastname.mkdir();//创建此抽象路径名指定的目录。
//返回值boolean 处理
}
//文件夹命名加UUID和当前时间拼接
String ud = UUID.randomUUID().toString();//获取String类型字符id
String newud = ud.replace("-", "");//去掉斜杠
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(new Date());
String newdate = format.replace("-", "");//去掉斜杠
System.out.println(newdate);
//上传文件后缀
String[] filenamesz = bookCoverFileName.split("\\.");
String houzhui = filenamesz[filenamesz.length-1];
//为了0风险吧前面的全部拼接
StringBuilder sb =new StringBuilder();
for(int i=0;i<filenamesz.length-1;i++){
sb.append(filenamesz[i]);
}
String lastfilename = sb.append(newud).append(newdate).append(".").append(houzhui).toString();
return lastfilename;
}
/**
* 数据库存储成功上传文件
* @param bookCover
* @param bookCoverFileName
* @param wenjianName
* @param lastfilename 上传文件命名
* @throws IOException
* @throws IllegalStateException
*/
public static void UploadFile(MultipartFile file,String BookCover,HttpServletRequest request) throws IllegalStateException, IOException{
String realPath= request.getServletContext().getRealPath("/");
File realPathFile = new File(realPath);
//返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
//加上文件名字
File last = new File(parent+BookCover);
file.transferTo(last);
}
/**
* @category 删除图片 或者修改删除图片
* @param list
*/
public static void delete(List<String> list,HttpServletRequest request){
String realPath = request.getServletContext()
.getRealPath("/");
File realPathFile = new File(realPath);
// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
String parent = realPathFile.getParent();
List<File> file = new CopyOnWriteArrayList<>();
// 遍历拼接路径
for (String s : list) {
File f = new File(parent + s);
file .add(f);
}
for (File f : file) {
System.out.println(f);
f.delete();// 这里我们马上删除
/**
* delete() : 这个方法能够删除 File 所代表的文件或者文件夹。 deleteOnExit() :
* 这个方法也能用来删除文件或者文件夹。所不同的是, delete()方法被调 用时,这个文件或者文件夹会被立刻删除, 而
* deleteOnExit()方法被调用后,文件或者文件 夹并不会立刻被删除, 而会等到程序退出以后再删除。
*/
}
}
}