最近工作中遇到这样一个问题,有两组服务器,比如one.abc.com和two.abc.com,程序部署在one服务器上,需要实现的功能是:
通过访问程序上传图片到two服务器,之前没有做过类似的功能,上网查了下资料,发现SWFUpload组件,
经过查资料和自己查看源代码,实现了这个功能,以下是我这次的总结。
首先将程序分别部署到one和tow服务器上。
前台index.jsp代码(注意将upload_url和flash_url路径修改为你要上传图片的服务器地址
)ps:form中的action路径没用着
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link href="<%=basePath%>css/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="<%=basePath%>js/swfupload/swfupload.js"></script>
<script type="text/javascript" src="<%=basePath%>js/swfupload/swfupload.queue.js"></script>
<script type="text/javascript" src="<%=basePath%>js/swfupload/fileprogress.js"></script>
<script type="text/javascript" src="<%=basePath%>js/swfupload/handlers.js"></script>
<script type="text/javascript">
var upload1, upload2;
window.onload = function() {
upload1 = new SWFUpload({
//提交路径
upload_url: "http://two.abc.com/struts2-ibatis/upload.do",//上传图片的服务器
//向后台传递额外的参数
post_params: {"name" : "kaobian"},
//上传文件的名称
file_post_name: "file",
// 下面自己按照字面意思理解
file_size_limit : "102400", // 100MB
file_types : "*.*",
file_types_description : "All Files",
file_upload_limit : "10",
file_queue_limit : "0",
// 事件处理
file_dialog_start_handler : fileDialogStart,
file_queued_handler : fileQueued,
file_queue_error_handler : fileQueueError,
file_dialog_complete_handler : fileDialogComplete,
upload_start_handler : uploadStart,
upload_progress_handler : uploadProgress,
upload_error_handler : uploadError,
upload_success_handler : uploadSuccess,
upload_complete_handler : uploadComplete,
// 按钮的处理
button_image_url : "images/XPButtonUploadText_61x22.png",
button_placeholder_id : "spanButtonPlaceholder1",
button_width: 61,
button_height: 22,
// Flash Settings swf文件的路径,需要修改为two服务器的地址
flash_url : "http://two.abc.com/struts2-ibatis/js/swfupload/swfupload.swf",
custom_settings : {
progressTarget : "fsUploadProgress1",
cancelButtonId : "btnCancel1",
progressStrid : "strid"
},
// Debug Settings
debug: false
});
}
</script>
</head>
<body>
<div id="content">
<form action="http://fxb.abc.com:8080/struts2-ibatis/swfUoload.do" method="post" name="thisform" enctype="multipart/form-data">
<table>
<tr valign="top">
<td>
<input type="text" name="str" id="strid" value=""/>
<div>
<div class="fieldset flash" id="fsUploadProgress1">
<span class="legend">文件上传</span>
</div>
<div style="padding-left: 5px;">
<span id="spanButtonPlaceholder1"></span>
<input id="btnCancel1" type="button" value="Cancel Uploads" onclick="cancelQueue(upload1);" disabled="disabled" style="margin-left: 2px; height: 22px; font-size: 8pt;" />
<br />
</div>
</div>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
action处理代码如下(注意action中的File名字也就是file要跟前台jsp中的file_post_name一致
)
package com.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import org.apache.struts2.ServletActionContext;
import org.json.JSONObject;
import com.opensymphony.xwork2.ActionSupport;
public class PictureAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private File file;
private String fileFileName;
private String fileContentType;
private String name;
public String execute() throws Exception {
// 实现上传
InputStream is = new FileInputStream(file);
String rootPath = this.getClass().getClassLoader().getResource("/")
.getPath();
rootPath = rootPath.substring(0, rootPath.indexOf("/WEB-INF/classes"));
File deskFile = new File(rootPath+"/upload/", this.getFileFileName());
OutputStream os = new FileOutputStream(deskFile);
byte[] bytefer = new byte[1024];
int length = 0;
while ((length = is.read(bytefer)) != -1) {
os.write(bytefer, 0, length);
}
name = "顾小白";
os.close();
is.close();
// 建立一个根对象
JSONObject root = new JSONObject();
root.put("id", "123");
root.put("title", "顾小白");
PrintWriter out = ServletActionContext.getResponse().getWriter();
out.print(root);
out.close();
return "success";
}
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置文件如下(注意如果要返回json数据格式需要表明返回类型
)
<action name="upload" class="com.action.PictureAction">
<result name="success" type="json"/>
<result name="input">/index.jsp</result>
</action>
最后是在handlers.js中的uploadSuccess方法接收你返回的数据(如我返回的是json格式)
function uploadSuccess(file, serverData) {
try {
var progress = new FileProgress(file, this.customSettings.progressTarget);
progress.setComplete();
document.getElementById(this.customSettings.progressStrid).value=serverData;
var data=eval("("+serverData+")");
alert(data["title"]);
progress.setStatus("Complete.");
progress.toggleCancel(false);
} catch (ex) {
this.debug(ex);
}
}
数据有了,要怎么处理就看你的需求了o(∩_∩)o
我是这样实现的,欢迎大家一起讨论。
分享到:
相关推荐
总的来说,SWFUpload跨域上传涉及到前端JavaScript和后端服务器的协作,前端负责与用户的交互和文件上传的控制,后端则处理文件的接收和返回结果。通过这样的方式,你可以实现用户在不同源之间的文件上传,同时获取...
由于Flash在处理跨域请求上有一定的优势,SwfUpload常被用于解决跨域文件上传的问题。SwfUpload通过与JavaScript的交互,可以很好地集成到EXTJS的界面中,实现前端的文件选取和上传控制。 跨域文件上传是Web开发中...
除了配置`crossdomain.xml`和SWFUpload实例,服务器端还需要处理跨域请求。在接收文件上传的API中,你需要在HTTP响应头中添加`Access-Control-Allow-Origin`字段,指定允许的源。例如,如果允许所有域: ```http ...
在本项目中,“SWFUpload多图上传、C#后端跨域传文件带参数”表明我们将探讨如何利用SWFUpload上传多个图片,并在C#后端处理这些文件,同时解决跨域问题并传递额外的参数。 首先,我们需要了解SWFUpload的工作原理...
在这个技术方案中,开发者使用了两个关键的JavaScript库:swfupload和ExtJS,以及后端的Java技术来处理跨域文件上传。 1. swfupload:这是一个开源的Flash上传组件,它允许用户在不离开当前页面的情况下上传多个...
10. **集成到现有项目**:将SWFUpload集成到现有的Web应用程序中,可能需要修改现有的前端和后端代码,以处理SWFUpload生成的文件上传请求。 综上所述,SWFUpload是一个强大的文件上传解决方案,它提供了丰富的功能...
3. 创建Java后台接口:根据设置的上传URL,编写对应的Servlet或Controller处理文件上传请求,接收上传的文件并保存到服务器。 SWFUpload实例中的"SWFTest"可能是一个包含测试代码的文件或目录,用于演示如何与Java...
- **Flash跨域策略文件**:由于Flash的安全限制,SWFUpload需要一个跨域策略文件,允许Flash与不同的域进行通信。 - **文件上传安全**:在ASP.NET中,要防止恶意文件上传,可以检查文件类型、大小,并对上传的文件名...
1. **SWFUpload组件**:SWFUpload是基于Adobe Flash的文件上传解决方案,它提供了丰富的API接口,可以自定义上传界面和处理逻辑。通过JavaScript与Flash进行通信,实现了异步上传,即在后台上传文件,不会阻塞用户...
`crossdomain.xml`文件是用于设置跨域策略的一个XML文件,它允许Flash应用程序(如SWFUpload)跨越不同的域名进行数据交互。如果该文件缺失或者放置位置不正确,则会导致上传操作失败,并返回400错误。 #### 解决...
3. **处理上传请求**:在Action类的execute方法中,使用Servlet API的`Part`接口或者Struts的`FileUpload`拦截器来接收上传的文件。你需要检查文件大小、类型,然后将其保存到服务器的指定位置。 4. **返回响应**:...
7. **MVC与Flash交互**:由于SwfUpload是基于Flash实现的,而Flash不支持跨域请求,因此在Asp.net MVC项目中使用时,需要确保前端和后端在同一域名下,或者配置CORS策略。 8. **安全考虑**:在实际应用中,要防止...
"UpLoadDemo.zip"这个压缩包文件提供了一个演示如何实现多图上传以及后端处理跨域请求并带有参数的功能。它利用了SWFUpload库,这是一种在Flash技术支持下进行文件上传的JavaScript库,常用于解决浏览器兼容性问题,...
1. **工作原理**:SWFUpload利用了Flash的跨域特性,使得用户可以选择并上传本地文件,而不受同源策略限制。Flash部分处理文件选择和上传,JavaScript部分则通过事件监听和回调函数,与页面交互,提供上传进度、状态...
你需要确保服务器正确设置响应头,允许跨域请求。 在实际项目中,开发者还需要关注性能优化,如分块上传、多文件并发上传等高级特性。通过熟练掌握这些知识点,你就能构建出高效且用户体验良好的Swf+ASP.NET无刷新...
尽管它的名字中含有“Upload”,但SwfUpload同样可以用于处理文件下载的情况。在ASP.NET中,我们可以通过SwfUpload提供的API来监控下载过程,并通过JavaScript更新页面上的进度条。 1. **SwfUpload的安装与配置** ...
在SWFUpload的工作原理中,它使用了Flash插件来绕过浏览器的同源策略限制,从而能够实现跨域文件上传。同时,通过JavaScript进行前端交互,与服务器端进行通信,确保上传过程的控制和反馈。这种异步上传方式不仅提高...
3. **服务器端处理**:在.NET中,你可以使用ASP.NET或ASP.NET MVC来处理上传请求。服务器端代码需要接收上传的文件,处理文件存储,以及返回响应数据(如成功/失败信息,进度更新等)。 4. **进度条更新**:...