`
左手边
  • 浏览: 96612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

跨域上传图片之FTP上传

 
阅读更多

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>

 

其他的就不用多说了,代码中的注释说的很清楚,大家可以自己看下

3
4
分享到:
评论
4 楼 li_yaya 2012-07-08  
你好  我想问下
import sw.common.util.ConfigDataInfo; 
是你自己写的类不审引用的类  如果是自己写你怎么没贴啊 如果是引用是哪个包啊

我的QQ:1207033472   麻烦你告诉我下了 谢谢
3 楼 haohao-xuexi02 2011-11-04  
( ^_^ )不错嘛。。。
2 楼 左手边 2011-11-04  
zhufeng1981 写道
挺实用的,支持一下,业务应该从Action中拿出去。

嗯 确实是
1 楼 zhufeng1981 2011-11-04  
挺实用的,支持一下,业务应该从Action中拿出去。

相关推荐

    FTP跨域上传

    FTP跨域上传是指在遵循同源策略的Web环境中,通过特定手段绕过限制,实现跨域的数据交换。 2. **跨域问题**:在Web开发中,浏览器有同源策略限制,即JavaScript只能访问与当前页面同源(协议、域名、端口都相同)的...

    pdf.js在java web项目中远程预览ftp上的pdf文件.docx

    FTPClient是一个功能强大的FTP客户端,可以用于下载和上传文件到远程FTP服务器上。 ### 7. InputStream的使用 在后台servlet中,需要使用InputStream来读取远程FTP服务器上的PDF文件,并将其传输给浏览器。...

    FTP多线程上传下载、断点续传、分段下载--田景吉之C#版本

    在单线程环境下,FTP上传和下载可能受限于网络带宽和处理器的单一执行能力。通过多线程,我们可以同时处理多个任务,充分利用系统资源,提高传输效率。在C#中,可以使用System.Threading命名空间中的ThreadPool或...

    web上实现类似ftp客户端上传和下载

    在Web开发中,实现类似FTP客户端的上传和下载功能是一项常见的需求,这使得用户可以通过浏览器直接操作远程服务器上的文件,而无需安装额外的FTP软件。本文将深入探讨如何在Web应用中实现这样的功能,以及涉及的相关...

    asp文件上传下载模块(完全能实现)

    - **文件类型检查**:限制可上传的文件类型,例如只允许上传图片、文档等安全格式。 - **文件大小限制**:设定上传文件的最大大小,防止大文件占用过多服务器资源。 - **权限控制**:确保只有授权用户能访问上传...

    图片裁剪 上传

    在IT行业中,图片裁剪和上传是常见的功能需求,尤其在网页和移动应用设计中,这一功能至关重要。本文将深入探讨“图片裁剪+上传”的技术实现及其修正版的优化策略。 图片裁剪通常涉及到图像处理领域,它允许用户...

    实现上传下载功能

    - **跨域问题**:如果涉及到不同源的交互,需要处理CORS(跨源资源共享)设置。 在提供的压缩包文件"UpDownFile"中,可能包含了实现上传下载功能的相关代码示例,这些代码可能涵盖客户端的前端部分以及服务器端的...

    通过Fckeditor把图片上传到独立图片服务器的方法

    配置IIS以支持Fckeditor上传图片,需要在图片服务器上设置相应的IIS应用程序,使其能够响应编辑器的请求。 4. 跨域问题处理:在不同的域之间进行资源的共享或数据的交换时,浏览器出于安全考虑会阻止跨域请求。在...

    PHP使用curl模拟post上传及接收文件的方法

    在PHP中,cURL是一个强大的库,用于与服务器进行交互,它支持多种协议,包括HTTP、FTP等。通过cURL,可以模拟几乎任何类型的网络请求。 1. cURL基础:cURL是客户端URL传输库,它可用于下载文件、上传文件、发送邮件...

    若依前后端分离项目部署文档.docx

    - 将jar包复制到Linux服务器,可以通过SSH或FTP工具实现。 2. **前端Vue项目打包**: - 运行`npm run build:prod --report`命令,生成的`dist`文件夹包含前端生产环境的静态资源。 - 同样将`dist`目录复制到...

    藏经阁-云存储之OSS实战进阶分享.pdf

    此外,阿里云提供了各种客户端工具,如命令行工具ossutil、客户端工具、挂盘工具ossfs、FTP工具ossftp,以及针对论坛软件如Discuz、phpwind和WordPress的插件,便于不同场景的使用。 **高可用性和稳定性:** OSS...

    fckeditor2.6.4 java配置好的项目下载

    - **图片上传**:FCKeditor支持图片上传,用户可以选择本地图片并上传至服务器。你需要在服务器端配置图片存储目录,并在Servlet中处理图片上传请求。 - **链接管理**:用户可以插入链接,编辑器会自动处理HTTP、...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 FTP之文件上传 06 FTP之断点续传 08 FTP之进度条 09 FTP之cd切换 11 FTP之创建文件夹及MD5校验思路 第33章 01 操作系统历史 02 进程的概念 03 线程的概念 04 线程的调用以及join方法 05 setDaemon方法和继承式...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 多线程 多线程案例 主线程与子线程 线程锁 线程之信号量 线程之Event 队列Queue 作业之主机批量管理 第10周 心灵分享 上节回顾 多...

    Discuz!音乐系统

    这一特性大大简化了音乐资源的上传流程,用户无需下载到本地再上传,节省了时间和网络资源。同时,FTP扫描还可以实现批量导入,提高音乐库的建立效率。 其次,本地资源扫描功能则方便用户快速整理和添加个人电脑中...

    若依前后端分离项目部署文档(完整版)

    同样地,使用FTP或其他工具将`dist`文件夹整体上传至Linux服务器。 ##### 安装与配置Nginx **3.1 安装Redis** 由于若依平台使用了Redis作为缓存解决方案,因此需要确保Linux服务器上已经安装并启动了Redis服务。 ...

    炫炫翅膀带我飞HTML5游戏源码

    2. 将源代码上传至服务器:使用FTP、SFTP或Git等工具将HTML、CSS、JavaScript及资源文件上传至服务器指定目录。 3. 配置服务器:根据游戏需求,可能需要设置重定向、跨域等HTTP头部信息。 4. 部署完成后,玩家可以...

    WNS_PPT_chap11_V1.1.ppt

    - 配置FTP站点用于出差员工下载和上传工作文档。 - 同样地,需要在DNS服务器上创建相应的A记录。 #### 跨域访问的配置 - **多域环境** - 案例涉及两个域:benet.com.cn 和 project.lcom。 - 为了实现benet域的...

    Vue PC项目发布流程.docx

    将打包后的文件上传到目标服务器的指定目录下,通常使用FTP、SCP或类似的工具进行文件传输。确保上传过程中文件的完整性和一致性。 九、处理跨域问题 如果项目涉及到跨域请求,可能需要在服务器端配置反向代理,...

Global site tag (gtag.js) - Google Analytics