工作笔记4.struts2上传文件到服务器

本文介绍两种:上传文件到服务器的方式

  一种是提交Form表单;另一种是ajaxfileupload异步上传。

一、JSP中:

    1、提交Form表单

为了能完成文件上传,我们应该将这两个表单域所在表单的enctype属性设置为multipart/form-data。

		<form action="uploadFiles_fourInsuranceFirstUpload.action" method="post" enctype="multipart/form-data">
			文件标题:<input type="text" name="title" /><br>
			选择文件:<input type="file" name="upload" /><br>
			<input value="上传" type="submit" />
		</form>

    2、ajaxfileupload异步上传

      <script src="${pageContext.request.contextPath}/script/jquery.js" type="text/javascript"></script>
      <script src="${pageContext.request.contextPath}/script/ajaxfileupload.js" type="text/javascript"></script><pre name="code" class="javascript">            <script type="text/javascript" language="javascript">
	//上传附件
	function uploadFile() {

		$.ajaxFileUpload( {
			url : 'tenantCredit_uploadFile.action', //你处理上传文件的服务端
			type : 'post',
			secureuri : false,
			fileElementId : 'fileUpload',
			dataType : 'text',
			success : function(data) {
				if (data == "true") {
					alert("上传文件成功!");
				} else {
					alert("上传失败!" );
				}
			}
		})
	}
      </script>
      <input type="file" id="fileUpload" name="upload" value="上传" />
      <input type="button"  id="btnUploadFile" onclick="javascript:uploadFile();" value="保存记录"/>

二、Action中该如何获取文件呢?

upload属性分别对应前面的表单域的upload属性,用于封装表单域的请求参数。

Action中包含了两个属性:

uploadFileName:封装上传文件的文件名

uploadContentType:封装上传文件的文件类型。Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts2直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和uploadContentType属性中。

可以认为:如果表单中包含一个name属性为xxx的文件域,则对应Action需要使用三个属性来封装该文件域的信息:

类型为File的xxx属性封装了该文件域对应的文件内容。(文中的 File upload属性中的upload就是下面两个string的属性的前缀)

类型为String的xxxFileName属性封装了该文件域对应的文件的文件名。

类型为String的xxxContentType属性封装了该文件域对应的文件的文件名。

通过上面的三个属性,可以更简单地实现文件上传,所以可以直接通过调用getXxx()方法来获取上传文件的文件名、文件类型和文件内容。

	// 封装上传文件域的属性
	private File upload;
	// 封装上传文件类型的属性
	private String uploadContentType;
	// 封装上传文件名的属性
	private String uploadFileName;
	// 标记上传文件的结果:成功/失败
	private String result;

	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}

	// 上传附件
	public String uploadFile() {
		try {
			String realpath = ServletActionContext.getServletContext().getRealPath("/data");			

			if (upload != null) {
				File savefile = new File(new File(realpath), uploadFileName);
				if (!savefile.getParentFile().exists())
					savefile.getParentFile().mkdirs();
				FileUtils.copyFile(upload, savefile);
				ActionContext.getContext().put("message", "文件上传成功");
			}
			// 提示:上传成功
			result = "true";
			outPrint(response, result);

		} catch (Exception e) {
			// 提示:上传失败
			String result = "false";
			outPrint(response, result);
		}
		return null;
	}

三、比较上述两种方式的优缺点:

1.验证是否选中文件:

①提交Form方式:

缺点:如果未选中文件,用JS捕获后return false,也会提交Form!还需要在Action的方法中进行判定。

②Ajax方式:

若未选中文件,用JS进行判定return false,将不会提交Action

2.传递参数的方式

①提交Form方式-2种:

利用ModelDriven属性,在Action中直接获取对应控件的value

或JSP中标识一个id,后在Action中定义此id的get、set方法,就可以直接取到。

②Ajax方式-3种:

同①

或通过JS中url传参的方式

3.接收Action中的返回结果

①提交Form方式:

把返回结果放在值栈/Session中,后再JSP中取出。

②Ajax方式:

同①

或JS回调函数通过data获取Action的返回值。

或JS回调函数通过data获取Action中outPrint

综合上述比较,推荐使用Ajax方式上传文件

时间: 2024-10-12 21:23:32

工作笔记4.struts2上传文件到服务器的相关文章

工作笔记4.struts2上传文件到server

本文介绍两种:上传文件到server的方式   一种是提交Form表单:还有一种是ajaxfileupload异步上传. 一.JSP中:     1.提交Form表单 为了能完毕文件上传,我们应该将这两个表单域所在表单的enctype属性设置为multipart/form-data. <form action="uploadFiles_fourInsuranceFirstUpload.action" method="post" enctype="mu

Android上传文件至服务器(转)

本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理:采用Android+Struts2技术. 一.Android端实现文件上传 1).新建一个Android项目命名为androidUpload,目录结构如下: 2).新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExce

利用put上传文件到服务器

#import "KUViewController.h" #import "KUProgress.h" @interfaceKUViewController ()<NSURLSessionTaskDelegate> //下载进度的类,继承UIview @property (weak, nonatomic) IBOutlet  KUProgress *progressView; @end @implementation KUViewController -

本地上传文件到服务器,从服务器下载文件到本地

最近在做项目的时候涉及到了文件的上传.下载,以前学习IO时也没有搞得多清楚,在网上找了些上传下载的例子,然后修改了部分.经测试,上传下载文件暂时能用,下面是上传和下载的方法: 1.本地上传文件到服务器 html代码: <form id="uploadDatumInfo" name="uploadDatumInfo" method="post" enctype="multipart/form-data" target=&q

put上传文件的服务器的配置

1,HTTP常见的方法 GET 获取指定资源 POST 2M 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源 HE A D 获取指定资源头部信息PUT 替换指定资源(不支持浏览器操作) DELETE 删除指定资源   2,配置服务器的put请求方式:   1> n 打开终端p cd /etc/apache2p sudo vim httpd.conf n 在vim中输入p /httpd-dav.conf? 查找httpd-dav.confp 按0将光标移动至行首p 按x将行首的

C# FTP上传文件至服务器代码

C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo">需要上传的文件</param> /// <param name="targetDir">目标路径</param> /// <param name="hostname">ftp地址</param&g

php上传文件到服务器 (注意权限)

表单<input type="file" name="upload_pic"> php上传文件到服务器,注意需要获取权限: if($_FILES['upload_pic']['size'] > 0) { $file_path=dirname(__FILE__); //文件目录 $file_path=str_replace('\\','/',substr($file_path,0,strpos($file_path,'application'))).

python 上传文件到服务器

def upload(filename): #buld post body data boundary = '--xxxxxxxxxxxxxxxx ' http_url='http://xx.xx.com/upload.php' data = [] data.append('--%s' % boundary) fp=open(filename,'rb') data.append('Content-Disposition: form-data; name="%s"; filename=&

Android中利用HTTP协议实现上传文件到服务器

首先我们需要使用HTTP协议发送数据,我们就要知道HTTP发送上传文件到服务器的时候需要哪些头字段已经相关的配置,请看下图 这是使用浏览器模拟上传文件到服务器时候所发送的请求,我们可以看到它包含了请求头字段和实体部分,但是多了一个---------------------------7da2137580612,它实际上是一条分隔线,用于分隔实体数据的,他在使用分隔实体数据的时候会在前面包含多两个"-"而在结束的时候会在除了在前面都出两个减号"-"之外,还会在末尾都出