以下代码如果没有耐心千万不要看,很费时的,自己觉得这个实现方式实在是太不给力了。
1.前台表单:
<script type="text/javascript">
var t = 1;
function addFileInput()
{
var parent = document.getElementById("more");
var br = document.createElement("br");
var input = document.createElement("input");
var button = document.createElement("input");
input.type = "file";
input.name = "uploadFile[" + (t++) + "].file";
input.size = "30";
button.type = "button";
button.value = "删除";
button.onclick = function()
{
parent.removeChild(br);
parent.removeChild(input);
parent.removeChild(button);
};
parent.appendChild(br);
parent.appendChild(input);
parent.appendChild(button);
}
</script>
<td id="more"><!--
<html:file property="uploadFile[0].file" /><br/>
<html:file property="uploadFile[1].file" /><br/>
<html:file property="uploadFile[2].file" />
-->
<input type="file" name="uploadFile[0].file" size="30">
<input type="button" onclick="addFileInput();" value="增加">
</td>
2. FileAction.java
/**
* 文件上传实现1.0
*/
public ActionForward addFile(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
FileForm fileForm = (FileForm)form;
List<UploadFile> uploadFiles = fileForm.getFormFiles();
// result = 0;
if(uploadFiles != null){
String root=request.getSession(true).getServletContext().getRealPath("/heyjdemo/upfiles/");
FileUploadTool fileUploadTool = new FileUploadTool();
fileUploadTool.saveFile(uploadFiles, root);
/*
*将文件信息保存到数据
*/
}
return mapping.findForward("success");
}
3. FileUploadTool.java
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.struts.upload.FormFile;
/**
* <p> 描述: 文件上传工具类,每次上传的文件都上传到时upifles目录中,根据年月别保存到
* 相应的目录下,如当年月为2011-3 则文件相应的路径为:/upfiles/2010_3/
* </p>
*
* <p> 原则:
*
* 如果是单文件上传,用户界面文件表单为:<html:file property="formFile" />
* 如果是多文件上传,用户界面文件表单为如下格式,其中uploadFile数组大小可以任意,建议不要太大:
* <html:file property="uploadFile[0].file" /><br/>
<html:file property="uploadFile[1].file" /><br/>
<html:file property="uploadFile[2].file" />
* </p>
*
* <p> 作用: 1.文件名,文件路径,文件大小,文件类型,将文件保存到磁盘(支持多文件上传)
* 2.删除磁盘中的文件
* 3.垃圾文件(夹)清理 未实现*************************
* 4.断点续传未实,现期待给力哥***********************
*
* </p>
*
* <p> Create Date:2011-3-14 </p>
*
*/
public class FileUploadTool {
/**
* 保存单个文件后所得到的信息
*/
private String fname = "";
private String furl = "";
private String ftype = "";
private float fsize = 0;
/**
* 保存多个 文件后所得到的信息
*/
private List<String> fnames;
private List<String> furls;
private List<String> ftypes;
private List<Float> fsizes;
public String getFname() {
return fname;
}
public String getFurl() {
return furl;
}
public String getFtype() {
return ftype;
}
public float getFsize() {
return fsize;
}
public List<String> getFnames() {
return fnames;
}
public List<String> getFurls() {
return furls;
}
public List<String> getFtypes() {
return ftypes;
}
public List<Float> getFsizes() {
return fsizes;
}
/**
* 获得唯一的字符串前缀
* 使用日期+随机数
* @return
*/
public String getUniqueString(){
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currrentDateStr = simpleDateFormat.format(date);
int randInt = (int)( Math.random()*10000);
String uniqueStr = (currrentDateStr + randInt).replaceAll(" ", "")
.replaceAll(":", "").replaceAll("-", "");
return uniqueStr;
}
/**
* 保存单个文件,
* 当返回为1时,保存文件成功,当返回为0时,保存不成功
* @param file
* @param preFurl
* @param preFname
* @return
*/
public int saveFile(FormFile file, String root, String preFname){
//保存文件
try{
fsize = file.getFileSize();
/**
* 当文件大小为0时不上传此文件
*/
if(0 == fsize){
return 0;
}
String[] tempStr = preFname.split("\\.");
if(tempStr.length>0){
ftype = tempStr[tempStr.length - 1 ];
}
fname = getUniqueString();
furl = root + "\\" + fname;
if(!"".equals(ftype)){
furl += "." + ftype;
}
InputStream in = file.getInputStream();
System.out.println(furl);
OutputStream out = new FileOutputStream(furl);
int read = 0;
//fsize = 0;
byte[] buffer = new byte[1024];
while((read = in.read(buffer,0,1024)) != -1){
out.write(buffer, 0, read);
// fsize += read;
}
in.close();
out.close();
}catch(Exception e){
e.printStackTrace();
return 0;
}
///fsize /= 1024;//转换成kb
return 1;
}
/**
* 保存多个文件
* 利用保存单个文件的功能模块来实现多文件保存
* @param files
* @param url
*/
public void saveFile(List<UploadFile> files, String root){
/*
* 初始化
*/
fnames = new ArrayList<String>();
furls = new ArrayList<String>();
ftypes = new ArrayList<String>();
fsizes = new ArrayList<Float>();
/*
* 保存文件
*/
for(UploadFile file : files){
FormFile formFile = file.getFile();
if(formFile == null){
continue;
}
saveFile(formFile,root,formFile.getFileName());
fnames.add(fname);
furls.add(furl);
ftypes.add(ftype);
fsizes.add(fsize);
}
}
/**
* 删除单个文件
* @param furl
*/
public boolean deleteFile(String furl){
java.io.File file = new java.io.File(furl);
if(file.exists()){
file.delete();
return true;
}else{
return false;
}
}
/**
* 删除多个文件
* @param furls
*/
public List<Boolean> deleteFile(List<String> furls){
List<Boolean> results = new ArrayList<Boolean>();
for(String furl : furls){
results.add(deleteFile(furl));
}
return results;
}
public void cleanRubbishFiles(){
}
}
4. FileForm.java
/**
* <p> 描述: 文件DAO</p>
*
* <p> 原则:
* 如果是单文件上传,用户界面文件表单为:<html:file property="formFile" />
* 如果是多文件上传,用户界面文件表单为如下格式,其中uploadFile数组大小可以任意,建议不要太大:
* <html:file property="uploadFile[0].file" /><br/>
<html:file property="uploadFile[1].file" /><br/>
<html:file property="uploadFile[2].file" />
* </p>
*
* <p> 作用: </p>
*
* <p> Create Date:2011-3-14 </p>
*
*/
public class FileForm extends ActionForm {
private File file = new File();
private List<File> files;
private Page page = new Page(1,3);
/**
* Struts文件表单域
*/
private FormFile formFile;
/**
* 多个文件
* @return
*/
private List<UploadFile> formFiles = new ArrayList<UploadFile>();
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
public FormFile getFormFile() {
return formFile;
}
public void setFormFile(FormFile formFile) {
this.formFile = formFile;
}
public List<UploadFile> getFormFiles() {
return formFiles;
}
public void setFormFiles(List<UploadFile> formFiles) {
this.formFiles = formFiles;
}
public FileForm(){
}
/**
* 注意这个方法的定义 不加中间的循环是会出错的,
* struts1多文件上传时,是数组 ----》list的过程,不能类型转换
* @param index
* @return
*/
public UploadFile getUploadFile(int index) {
int size = formFiles.size();
if (index > size - 1) {
for (int i = 0; i < index - size + 1; i++) {
formFiles.add(new UploadFile());
}
}
return (UploadFile) formFiles.get(index);
}
}
5.UploadFile.java
import java.io.Serializable;
import org.apache.struts.upload.FormFile;
/**
* <p> 描述: struts1文件上传时的formfile </p>
*
* <p> 原则: </p>
*
* <p> 作用: </p>
*
* <p> Create Date:2011-3-15 </p>
*
*/
public class UploadFile implements Serializable {
private FormFile file;
public FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
}
分享到:
相关推荐
- `commons-fileupload-1.2.1.jar`:用于文件上传的组件。 #### Struts2应用的配置文件 Struts2的配置文件主要负责定义Action、拦截器和其他配置信息。示例配置文件如下: ```xml <?xml version="1.0" encoding=...
- **上传原理**:Struts2利用MultipartResolver实现文件上传功能。 - **配置与实现**: - 在`struts.xml`中配置上传相关的参数。 - 实现Action类中文件上传的具体逻辑。 **5.2 文件下载** - **下载原理**:Struts...
- **多文件上传**:与单个文件上传类似,但需要在表单中定义多个`<input type="file">`元素。 #### 自定义拦截器 - **定义拦截器类**:创建一个实现了`Interceptor`接口的类。 - **配置拦截器和拦截器栈**:在`...
- `commons-fileupload-1.2.1.jar`: 文件上传支持。 4. **配置过滤器**:编辑`/Webroot/WEB-INF/web.xml`文件,添加Struts2的过滤器配置。 ```xml <filter-name>struts2 <filter-class>org.apache.struts2....
Struts2提供了文件上传的支持,可以通过`File`类型的字段来接收上传的文件。 ##### 9.10 防止表单重复提交 Struts2提供了防止表单重复提交的机制,可以通过令牌机制来实现。 ##### 9.11 Struts中Result标签 ...