下面就给您讲解一下“SSH框架网上商城项目第13战之Struts2文件上传功能”的完整攻略。
一、Struts2文件上传功能简介
Struts2文件上传功能是指在Struts2框架中,用户可以通过向服务器提交文件的方式来实现文件上传的功能。Struts2文件上传功能通常采用Apache Commons FileUpload库来实现,可以对上传的文件进行大小、类型等方面的限制,同时支持上传多个文件。
二、实现Struts2文件上传的步骤
下面是实现Struts2文件上传功能的步骤:
1.在Struts2配置文件中添加上传功能的拦截器
在Struts2配置文件中,需要添加一个用于处理文件上传的拦截器,一般会用Apache Struts2文件上传拦截器,具体配置如下:
<interceptors>
<interceptor name="myFileUpload"
class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor-stack name="myDefault">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myFileUpload"/>
</interceptor-stack>
</interceptors>
2.在Action类中添加上传文件属性及其get和set方法
在Action类中,需要添加一个用于保存上传文件的属性,同时定义获取和设置该属性的get和set方法,具体代码如下:
private File file; // 用于保存上传文件
private String fileFileName; // 上传文件的文件名
private String fileContentType; // 上传文件的类型
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
3.在Action类中添加处理文件上传的方法
在Action类中,需要为上传文件新增一个处理方法,一般建议将该方法命名为doUpload()。在该方法中,需要定义一个FileInputStream对象,从而从上传的文件中读取数据,并将数据写入到服务器指定的文件中。具体代码如下:
public String doUpload() throws Exception {
FileInputStream fileInputStream = new FileInputStream(file);
String filePath = "D:\\" + fileFileName;
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer,0,len);
}
fileInputStream.close();
fileOutputStream.close();
return SUCCESS;
}
4.通过表单页面上传文件
最后一步是编写上传文件的表单页面。表单中需要定义一个file类型的input标签,以便用户选择要上传的文件。具体代码如下:
<s:form action="doUpload" method="post" enctype="multipart/form-data">
<s:file name="file" label="上传文件"/>
<s:submit/>
</s:form>
三、Struts2文件上传功能的限制
为了保证系统的安全性和稳定性,通常需要对Struts2文件上传功能进行一些限制:
- 限制上传文件的大小,防止上传过大的文件导致服务器崩溃;
- 限制上传文件的类型,防止上传不受控制的文件类型,如webshell等;
- 限制上传文件的数量,防止上传过多文件导致系统资源的浪费。
下面是实现文件上传限制的代码示例:
限制上传文件的大小
<interceptors>
<interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
<param name="maximumSize">1024000</param> <!-- 上传文件的最大大小为1024KB -->
</interceptor>
<interceptor-stack name="myDefault">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myFileUpload"/>
</interceptor-stack>
</interceptors>
限制上传文件的类型
<interceptors>
<interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
<param name="allowedTypes">image/jpeg,image/png</param> <!-- 上传文件的类型只允许为jpeg和png格式 -->
</interceptor>
<interceptor-stack name="myDefault">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myFileUpload"/>
</interceptor-stack>
</interceptors>
限制上传文件的数量
<interceptors>
<interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
<param name="maximumSize">1024000</param> <!-- 上传文件的最大大小为1024KB -->
<param name="allowedTypes">image/jpeg,image/png</param> <!-- 上传文件的类型只允许为jpeg和png格式 -->
<param name="maximumFiles">5</param> <!-- 上传的文件数量最多为5个 -->
</interceptor>
<interceptor-stack name="myDefault">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myFileUpload"/>
</interceptor-stack>
</interceptors>
四、示例
下面给出两个Struts2文件上传的示例:
示例1:上传单个文件
以上传一张图片为例来演示单个文件上传的过程。
- 编写上传文件的表单页面:
<s:form action="doUpload" method="post" enctype="multipart/form-data">
<s:file name="file" label="上传图片"/>
<s:submit/>
</s:form>
- 编写Action类代码
public class UploadAction extends ActionSupport {
private File file;
private String fileFileName;
private String fileContentType;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String doUpload() throws Exception {
FileInputStream fileInputStream = new FileInputStream(file);
String filePath = "D:\\" + fileFileName;
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer,0,len);
}
fileInputStream.close();
fileOutputStream.close();
return SUCCESS;
}
}
示例2:上传多个文件
以上传多张图片为例来演示多个文件上传的过程。
- 编写上传多个文件的表单页面:
<s:form action="doUpload" method="post" enctype="multipart/form-data">
<s:file name="files" label="选择图片" multiple="true"/>
<s:submit/>
</s:form>
注意:添加多个文件上传的功能需要在文件框中添加multiple="true"属性。
- 编写Action类代码
public class UploadAction extends ActionSupport {
private List<File> files;
private List<String> filesFileName;
private List<String> filesContentType;
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
public List<String> getFilesFileName() {
return filesFileName;
}
public void setFilesFileName(List<String> filesFileName) {
this.filesFileName = filesFileName;
}
public List<String> getFilesContentType() {
return filesContentType;
}
public void setFilesContentType(List<String> filesContentType) {
this.filesContentType = filesContentType;
}
public String doUpload() throws Exception {
for (int i = 0; i < files.size(); i++) {
FileInputStream fileInputStream = new FileInputStream(files.get(i));
String filePath = "D:\\" + filesFileName.get(i);
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer,0,len);
}
fileInputStream.close();
fileOutputStream.close();
}
return SUCCESS;
}
}
五、总结
以上就是实现Struts2文件上传功能的完整攻略,主要涉及到Struts2文件上传的步骤、限制和示例。需要注意的是,在进行文件上传操作时,一定要注意对文件大小、文件类型和上传数量等方面进行限制,以确保系统的安全性和稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SSH框架网上商城项目第13战之Struts2文件上传功能 - Python技术站