第一步
框架的选择
在struts2-core-2.1.8.1.jar包里面 按照 org.apache.struts2 查询 找到default.porperties 默认的资源文件
看到关于上传文件的信息
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
struts.multipart.parser= 是选择哪种框架形式来上传文件
在这里struts.multipart.parser=jakarta 默认的是jakarta jakarta是Commo-FileUpload 的框架,所有要导入"commons-fileupload-1.2.1.jar"和"commons-io-1.3.2.jar"
如果改成struts.multipart.parser=cos 那就是用cos框架上传 只要导入cos.jar
想要改变struts.multipart.parser 的值 有两种方式
一是在struts2-core-2.1.8.1.jar中的default.porperties文件中去改
二是在struts.xml文件中加入<constant name="struts.multipart.paeser" value="cos"></constant> value的值就是你要选择上传的方式
需要的struts2的框架包(jar包)struts2-core-2.1.8.1.jar 一定要导入
根据你选择的文件上传的框架导入相应的jar包
第二步
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<form action="stu.action" method="post" enctype="multipart/form-data">
<input name="image" type="file"/>
<input type="submit" value="上传照片"/>
</form>
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。
当action为post时候,浏览器把form数据封装到http body中,然后发送到server。
如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。
但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以
控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
第三步
写action 这个action继承BaseAction
//为了演示 只设一个
public class BaseAction{
public static final java.lang.String SUCCESS = "success";
}
这里使用jakarta的框架类型
package com.aciton;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
public class StudentsAction extends BaseAction {
private File image; //文件内容
private String imageFileName; //文件名称
private String imageContentType; //文件类型
public File getImage() {
return image;
}
public void setImage(File image) {
this.image = image;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
public String getImageContentType() {
return imageContentType;
}
public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}
public String execute(){
String path = ServletActionContext.getServletContext().getRealPath("/image");
System.out.println(path);
if(image!=null){
File savefile = new File(new File(path),imageFileName);
if(!savefile.getParentFile().exists()){
savefile.getParentFile().mkdirs();
}
try {
FileUtils.copyFile(image,savefile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String [] t = imageContentType.split("/");
for(String s : t){
System.out.println(s);
}
}
return SUCCESS;
}
}
如果用cos框架的话
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { // myFile属性用来封装上传的文件 private File myFile; // myFileContentType属性用来封装上传文件的类型 private String myFileContentType; // myFileFileName属性用来封装上传文件的文件名 private String myFileFileName; //获得myFile值 public File getMyFile() { return myFile; } //设置myFile值 public void setMyFile(File myFile) { this.myFile = myFile; } //获得myFileContentType值 public String getMyFileContentType() { return myFileContentType; } //设置myFileContentType值 public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType; } //获得myFileFileName值 public String getMyFileFileName() { return myFileFileName; } //设置myFileFileName值 public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } public String execute() throws Exception { //基于myFile创建一个文件输入流 InputStream is = new FileInputStream(myFile); // 设置上传文件目录 String uploadPath = ServletActionContext.getServletContext() .getRealPath("/image"); // 设置目标文件 File toFile = new File(uploadPath, this.getMyFileFileName()); // 创建一个输出流 OutputStream os = new FileOutputStream(toFile); //设置缓存 byte[] buffer = new byte[1024]; int length = 0; //读取myFile文件输出到toFile文件中 while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } System.out.println("上传用户"+username); System.out.println("上传文件名"+myFileFileName); System.out.println("上传文件类型"+myFileContentType); //关闭输入流 is.close(); //关闭输出流 os.close(); return SUCCESS; } } 第四步 在struts.xml注册action
<!--<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "struts-2.1.7.dtd"> <struts> <package name="students" extends="struts-default"> <!-- 1:如果你整合了spring 那么class就写这个那个bean中的id名称,如果没有写,就写类的全名(com.action.StudentsAction)这是我的 2:如果这里你没有写method 那么你就要在form的action 写成stu!execute.action --> <action name="stu" method="execute" class="studentsAction"> <result name="success">upload.jsp</result> </action> </package> </struts>
如果控制台有Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir 输出来 这是提示我们struts.multipart.saveDir没有设值
struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件或者struts.xml配置文件中
如果是struts.properties文件,则加入如下代码:struts.multipart.saveDir = /tmp/;或者是struts.xml配置文件,则增加如下代码:<constant name="struts.multipart.saveDir" value="/tmp"/>
-->
<!--
struts的默认上传文件大小为2M,设置上传文件的大小
<constant name="struts.multipart.maxSize" value="104857600"></constant>
-->