Struts2上传文件
One=>看一哈单文件上传
我们直接上代码,代码中看
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.UUID;
import org.apache.struts2.ServletActionContext;
//这里UploadAction 类继承 ActionSupport
public class UploadAction extends ActionSupport{
private File upload;
private String uploadFileName;
private String uploadContentType;
/*
然后获取上面三个属性的set、get方法
这里就不放出来,不过在程序中一定要有set、get方法
这里还说哈:
private File upload;
这里 upload 这个名字可以随便去,但要和jsp页面中form表单中的 file 属性的 input的name一致
eg:
<form action="upload_uploadFile.action" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
...
</form>
private String uploadFileName;
这里的uploadFileName书写就有规定了,命名规则是:xxx+FileName,
这里"xxx"代表的是前面 File类型 属性,即这里的 “upload”,然后后面则必须是“FileName”,
代表的意思就是上传文件的名字,
private String uploadContentType;
同 “uploadContentType”一样的规则,也是 xxx+ContentType
这里代表的是获取文件的类型
!!!上面三个属性都是通过反射的原理获取到相应的内容
*/
-------------------------------------------------方法一---------------------------------------------------------------
//这里就是上传文件方法的书写了
public String uploadFile() throws Exception{
//获取路径
String path=ServletActionContext.getServletContext().getRealPath("/photo");
//获取文件后缀名
String fileh=uploadFileName.substring(uploadFileName.lastIndexOf("."));
//判断是否存在,不存在就创建
File file=new File(path);
if(!file.exists()&&!file.isDirectory()){
file.mkdirs();
//这里多层文件夹用 mkdirs(),一层的话就可以用mkdir()
}
//这里可以先判断哈有木有文件,然后再进行其他操作
if(uploadFileName!=null&&!uploadFileName.equals("")){
//FileInputStream读取本地文件
FileInputStream fis=new FileInputStream(upload);
//输出流FileOutputStream
FileOutputStream fos=new FileOutputStream(file+"/"+UUID.randomUUID().toString()+fileh);
/*
*这里UUID.randomUUID().toString()保证上传文件名不重复,防止上传文件同名的话覆盖前面已上传的文件
*/
======================================
//整一个缓冲区
byte[] buffer=new byte[1024];
int len=fis.read(buffer);
//读取文件是,末尾为-1
while(len!=-1){
fos.write(buffer);
len=fis.read(buffer);
}
=======================================
上面框起来的区域也可以这样写:
//读、写
byte[] bt=new byte[1024];
int len=0;
while((len=fis.read(bt))>0){
fos.write(bt, 0, len);
}
=======================================
//关闭流
fos.close();
fis.close();
}
return "success";
}
------------------------------------------------方法二------------------------------------------------------------
public String upload() throws IOException{
String path = ServletActionContext.getServletContext().getRealPath("/photo");
//在服务器路径下判断是否有photo这个文件夹,没有就创建一个
//但是这个文件夹是临时的,如果项目重新部署的话会被删除
File file = new File(path);
if(!file.exists()){
file.mkdir();
}
//为了避免文件名重复,这里选择用uuid重命名(肯定不会重复)
uploadFileName = UUID.randomUUID().toString()+uploadFileName;
//将文件拷贝到服务器路径下
FileUtils.copyFile(upload, new File(file,uploadFileName));
System.out.println("上传成功..");
return "success";
}
Two=>看一哈多文件上传
还是代码中看
这里还是一样 ,三个属性,不过要定义成数组样式的,其他注意的同上面一样,命名规则等..
private File[] uploadFile;
private String[] uploadFileFileName;
private String[] uploadFileContentType;
这里get、set方法 ...
然后我么直接上方法
------------------------------------------------书写一------------------------------------------------------------
public String multiplePload(){
//判断一下是否上传了文件,即upload是否为空,不为空,才进行上传的操作。
if(uploadFile!=null){
for(int i=0;i<uploadFile.length;i++){
//设置上传文件的放置位置,通常放在服务器下面的photo文件夹下.
String path=ServletActionContext.getServletContext().getRealPath("/photo");
//这是一个目录,如果这个目录不存在,需要创建这个目录(包括其父目录)
File srcFile=new File(path);
if(!srcFile.exists()&&!srcFile.isDirectory()){
srcFile.mkdirs();
}
//通常还需要对上传的文件名进行UUID的操作,使文件名不能重复。
String fileName=UUID.randomUUID().toString()+this.getUploadFileFileName()[i];
//调用FileUtils类执行上传的操作.
try {
FileUtils.copyFile(uploadFile[i],new File(srcFile,fileName));
System.out.println("文件上传成功...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "success";
}
------------------------------------------------书写二------------------------------------------------------------
public String saveFile() throws Exception{
//获取路径
String path=ServletActionContext.getServletContext().getRealPath("/");
//创建文件夹
File file=new File(path+"photo/");
//判断是否存在文件夹
if(!file.exists()&&!file.isDirectory()){
//不存在,创建文件夹
file.mkdirs();
}
//判断一下是否上传了文件,即upload是否为空,不为空,才进行上传的操作。
if(uploadFile!=null){
for (int i = 0; i < uploadFile.length; i++) {
//定义输出流程,指定文件的写入路径
String fielName=UUID.randomUUID().toString()+this.getUploadFileFileName()[i];
FileOutputStream fos=new FileOutputStream(file+"/"+fielName);
FileInputStream fin=new FileInputStream(this.getUploadFile()[i]);
//读、写
byte[] bt=new byte[1024];
int len=0;
while((len=fin.read(bt))>0){
fos.write(bt, 0, len);
}
//关闭流
fin.close();
fos.close();
System.out.println("上传成功");
}
}
return "success";
}
这里还说一点
jsp页面中的
<input type="file" name="upload">
<input type="file" name="upload">
这里 type=“file” 的input中的name一样
然后也你可以这样
<input type="file" name="upload" ultiple="multiple">
加上 ultiple=“multiple” 写一个就行了
最后
在struts.xml中
<!-- 上传文件最大容量 全局设置-->
<constant name="struts.mulitiport.maxSize" value="4000000" />
<packag...
<action name="fileUp_*" class="fileAction" method="{1}">
<interceptor-ref name="fileUpload">
<!-- 配置上传文件类型 -->
<param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpeg,image/jpg</param>
<!-- 设置拦截器,拦截图片上传的类型和大小 -->
<param name="maximumSize">10M</param>
</interceptor-ref>
<!-- 局部默认拦截器 -->
<interceptor-ref name="defaultStack" />
<!-- 成功后返回的界面 -->
<result name="success">/main.jsp</result>
<!-- 失败后返回的界面 -->
<result name="error">/error.jsp</result>
</action>
这里加一个公共上传文件Action类写法
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.struts2.ServletActionContext;
public class UpFile implements Serializable{
//(文件、文件名、文件类型)
public static Map<String,Object> saveFile(File[] uploadFile,String[] uploadFileFileName,String[] uploadFileContentType)
throws Exception{
Map<String,Object> map=new HashMap<String, Object>();
//说一哈这个 map 的作用:就是保存上传文件的名字,然后返回结果
//获取路径
String path=ServletActionContext.getServletContext().getRealPath("/");
//创建文件夹
File file=new File(path+"photo2/");
//判断是否存在文件夹
if(!file.exists()&&!file.isDirectory()){
//不存在,创建文件夹
file.mkdirs();
}
//判断一下是否上传了文件,即upload是否为空,不为空,才进行上传的操作。
if(uploadFile!=null){
for (int i = 0; i < uploadFile.length; i++) {
//定义输出流程,指定文件的写入路径
String fielName=UUID.randomUUID().toString()+uploadFileFileName[i];
FileOutputStream fos=new FileOutputStream(file+"/"+fielName);
FileInputStream fin=new FileInputStream(uploadFile[i]);
//读、写
byte[] bt=new byte[1024];
int len=0;
while((len=fin.read(bt))>0){
fos.write(bt, 0, len);
}
//关闭流
fin.close();
fos.close();
map.put(i+"",fielName); //这里msp保存数据的时候key是根据i的自增设置的从0开始
}
}
return map;
}
}
在需要上传文件的时候需要直接该类名调用此方法传入相关的参数就行了