您的位置:首页 > 编程语言 > Java开发

struts2实现单个文件上传

2012-11-19 11:21 435 查看
第一步

框架的选择

在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>

-->


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: