1、跟上一篇SWFUpload跨域请求处理的需求一样,都是将图片跨域上传到另一台服务器上,朋友介绍了另一种实现方法即FTP上传。
2、首先将commons-net-ftp-2.0.jar包准备一下
3、前端jsp
<%@ 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" />
</head>
<body>
<div id="content">
<form action="ftpUpload.do" method="post" enctype="multipart/form-data">
<table>
<tr valign="top">
<td>
<input type="file" name="myFile"/>
<input type="submit"/>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
4、struts配置文件
<action name="ftpUpload" class="com.action.FTPAction" method="ftpUpload">
<result name="success">/index_ftp.jsp</result>
<result name="input">/index_ftp.jsp</result>
</action>
5、action处理代码如下
package com.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import sw.common.util.ConfigDataInfo;
public class FTPAction extends BaseAction {
/** */
private static final long serialVersionUID = 1L;
/**
* FtpClient对象
*/
private FTPClient ftpClient;
/**
* 缓冲的大小
*/
private String bufferSize;
/**
* 文档的类型
*/
private String contentType;
private File myFile;
private String myFileFileName;
private String myFileContentType;
public String ftpUpload() {
String server = ConfigDataInfo.getConfigValue("server");
int port = Integer.parseInt(ConfigDataInfo.getConfigValue("port"));
String user = ConfigDataInfo.getConfigValue("user");
String password = ConfigDataInfo.getConfigValue("password");
String path = ConfigDataInfo.getConfigValue("path");
File file_in = myFile;
this.ftpUploadFile(server, port, user, password, path, file_in);
return SUCCESS;
}
/**
* ftp上传文件
* @param server FTP服务器地址,如192.168.0.111
* @param port FTP端口,如21
* @param user FTP登录用户名,如:ADMIN
* @param password FTP登录密码,如:111111
* @param path FTP上传路径,如:h:\ftp\
* @param file_in 上传文件
*/
public String ftpUploadFile(String server,int port,String user,String password,String path,File file_in) {
if (!file_in.isFile()) {
// 是否文件,或找不到指定文件
this.addActionError("customer.electroFile.errors.FileNotFound");
return "";
}else if(!fileSize(file_in)){
//控制文件大小
return "";
}
//文件名
String file_inName="";
//登录FTP服务器
this.connectServer(server, port, user, password);
//有出错信息
if (hasActionErrors()) {
return "";
}
try {
if (path != null) {
// 检查path最后有没有分隔符
path = this.pathAddress(path);
//新建路径
// FTP转到PATH路径
this.mkdir(server, port, user, password, path);
ftpClient.changeWorkingDirectory(gbktoiso8859(path));
} else {
this.addActionError(getText("customer.electroFile.errors.ftpPath"));
closeConnect();
return "";
}
// 给文件名加上时间撮
file_inName = this.getMyFileFileName();
final int lastIndex = file_inName.lastIndexOf(".");
file_inName = file_inName.substring(0, lastIndex) + "_"
+ System.currentTimeMillis()
+ file_inName.substring(lastIndex);
FileInputStream fileIS=new FileInputStream(file_in);
boolean flag=ftpClient.storeFile(gbktoiso8859(file_inName), fileIS);
if (!flag) {
closeConnect();
this.addActionError("customer.electroFile.errors.FileUpload");
}
}catch(final FileNotFoundException fnfe){
this.addActionError("customer.electroFile.errors.FileNotFound");
} catch (final IOException ex) {
this.addActionError(getText("customer.electroFile.errors.Connect"));
}finally{
//退出FTP服务器
this.closeConnect();
}
return file_inName;
}
/**
* 新建路径
*
* @param server FTP服务器地址,如192.168.0.111
* @param port FTP端口,如21
* @param user FTP登录用户名,如:ADMIN
* @param password FTP登录密码,如:111111
* @param path FTP上传路径,如:h:\ftp\
* @param fileName 要删除的文件名
* @return
*/
public boolean mkdir(String server,int port,String user,String password,String path){
this.connectServer(server, port, user, password);
if (hasActionErrors()) {
return false;
}
try {
if (path!=null) {
//检查path最后有没有分隔符
path=this.pathAddress(path);
}else {
this.addActionError(getText("customer.electroFile.errors.ftpPath"));
return false;
}
boolean flag=ftpClient.makeDirectory(gbktoiso8859(path));
//错误也不给予提示
return true;
} catch (final IOException ex) {
this.addActionError(getText("customer.electroFile.errors.mkdir"));
}
return false;
}
/**
* 登录ftp服务器
*
* @param server
* @param port
* @param user
* @param password
* @
*/
private void connectServer(String server, int port, String user, String password) {
if (ftpClient == null) {
try {
ftpClient=new FTPClient();
//所有使用iso-8859-1做为通讯编码集
//ftpClient.setControlEncoding("iso-8859-1");
//ftpClient.configure(getFTPClientConfig());
// 连接FTP服务器
ftpClient.connect(server, port);
// 登录FTP服务器
if(!ftpClient.login(user, password)){
this.addActionError(getText("customer.electroFile.errors.logonFTP"));
}
//状态
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
closeConnect();
this.addActionError(getText("customer.electroFile.errors.logonFTP"));
}
// 用被动模式传输
ftpClient.enterLocalPassiveMode();
// 将文件传输类型设置为二进制
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//防止server超时断开
//ftpClient.setDefaultTimeout(60000);
//10超时
ftpClient.setSoTimeout(10000);
}catch(SocketException se){
this.addActionError(getText("customer.electroFile.errors.logonFTP"));
closeConnect();
}catch (final IOException ex) {
this.addActionError(getText("customer.electroFile.errors.logonFTP"));
closeConnect();
}
}
}
/**
* 格式化文件路径
* @param path
* @return
*/
public String pathAddress(String path){
if (path==null || path.length()<1) {
return "";
}
String temp_path=path.substring(path.length()-1);
if (!temp_path.equals("/") && !temp_path.equals("\\")) {
temp_path=path+File.separator;
}else{
temp_path=path;
}
return temp_path;
}
/**
* 转码[GBK -> ISO-8859-1]
*不同的平台需要不同的转码
* @param obj
* @return
*/
private static String gbktoiso8859(Object obj) {
try {
if (obj == null)
return "";
else
return new String(obj.toString().getBytes("GBK"), "iso-8859-1");
} catch (Exception e) {
return "";
}
}
/**
* 关闭连接
*/
private void closeConnect() {
try {
if (ftpClient != null) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (Exception e) {
}
}
/**
* 控制文件的大小
* @param file_in
*/
private boolean fileSize(File file_in) {
if (file_in == null || file_in.length() == 0) {
addActionError(getText("customer.electroFile.errors.fileUnallowed"));
return false;
} else {
if (file_in.length() > (1024 * 1024 * 5)){
addActionError(getText("customer.electroFile.errors.fileTooLarge"));
return false;
}
}
return true;
}
public FTPClient getFtpClient() {
return ftpClient;
}
public void setFtpClient(FTPClient ftpClient) {
this.ftpClient = ftpClient;
}
public String getBufferSize() {
return bufferSize;
}
public void setBufferSize(String bufferSize) {
this.bufferSize = bufferSize;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
}
6、还有一个参数的配置文件
<bean id="ConfigDataInfo" class="sw.common.util.ConfigDataInfo">
<property name="configDataInfo">
<map>
<entry key="resourceServer" value="http://192.2.9.xxx:8090/gameshop" />
<entry key="shopServer" value="http://192.2.9.xxx:8090/gameshop" />
<entry key="server" value="192.2.11.xxx" />
<entry key="user" value="user" />
<entry key="password" value="pawd" />
<entry key="port" value="21" />
<entry key="path" value="" />
</map>
</property>
</bean>
其他的就不用多说了,代码中的注释说的很清楚,大家可以自己看下
分享到:
相关推荐
ajax上传图片,PHP上传图片,PHP上传图片跨域,跨域上传图片,上传图片缩览图
ueditor跨域图片上传ueditor跨域图片上传ueditor跨域图片上传ueditor跨域图片上传ueditor跨域图片上传ueditor跨域图片上传ueditor跨域图片上传
Layui图片上、视频、音频、文件上传接口及跨域上传,此项目案例包含了多种上传方式,欢迎大家下载
Stream跨域上传文件,Stream2和Stream3是两个工程直接MyEclipse导入就可以使用
ajax文件上传,跨域上传,html页面来着,下载下来就可以直接使用。 ajax文件上传,跨域上传,html页面来着,下载下来就可以直接使用。
FTP跨域上传图片,可以返回自己所需的一些数据,如:图片名、路径、上传成功与否的标志位等
百度富文本框(Ueditor)自定义图片上传接口,并解决单图片上传的跨域问题,Ueditor官方说不支持跨域上传,我想说呵呵o(* ̄︶ ̄*)o
js异步上传图片,上传图片前进行压缩处理,支持跨域。例如470kb的图片压缩后40kb。上传部分在另一个mvc项目中 从而实现跨域上传文件,可以返回文件名等json数据。上传部分稍微修改同样适用不是mvc项目,很简单的改动...
Asp.Net使用HttpWebRequest跨域上传,可以实现asp.net跨域文件上传或者大数传输
ueditor前后端分离跨域上传图片出错,实例代码,单个图片上传,多个图片上传跨域问题。ueditor前后端分离跨域上传图片出错,实例代码。
基于无刷新上传图片技术,使用最普通的html页面技术,支持ie6+浏览器
找到这个资源到解决,走了很多弯路,从官网下下来之后发现也有问题,经过调整终于可以正常运行了。这个js框架支持跨域上传,的确支持跨域。
真正解决百度编辑器UEditor上传图片跨域问题 真正解决百度编辑器UEditor上传图片跨域问题 真正解决百度编辑器UEditor上传图片跨域问题
减轻服务器压力,为减少项目文件的变迁更改
客户端使用uploadify插件进行上传文件、图片。服务端使用c#进行开发设计,使用ashx一般处理程序来接收文件。
ftp跨域配置.txt
跨域上传net,uploadify,通过uploadify上传,最新uploadify的flash上传,以测试可以用。
SWFUpload组件实现跨域上传图片,并且返回所需的数据(如:图片名称、路径等)
主要介绍了Java使用Ajax实现跨域上传图片功能,需要的朋友可以参考下
ext struts2 swfupload 跨域文件上传