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>
其他的就不用多说了,代码中的注释说的很清楚,大家可以自己看下
分享到:
相关推荐
FTP跨域上传是指在遵循同源策略的Web环境中,通过特定手段绕过限制,实现跨域的数据交换。 2. **跨域问题**:在Web开发中,浏览器有同源策略限制,即JavaScript只能访问与当前页面同源(协议、域名、端口都相同)的...
FTPClient是一个功能强大的FTP客户端,可以用于下载和上传文件到远程FTP服务器上。 ### 7. InputStream的使用 在后台servlet中,需要使用InputStream来读取远程FTP服务器上的PDF文件,并将其传输给浏览器。...
在单线程环境下,FTP上传和下载可能受限于网络带宽和处理器的单一执行能力。通过多线程,我们可以同时处理多个任务,充分利用系统资源,提高传输效率。在C#中,可以使用System.Threading命名空间中的ThreadPool或...
在Web开发中,实现类似FTP客户端的上传和下载功能是一项常见的需求,这使得用户可以通过浏览器直接操作远程服务器上的文件,而无需安装额外的FTP软件。本文将深入探讨如何在Web应用中实现这样的功能,以及涉及的相关...
- **文件类型检查**:限制可上传的文件类型,例如只允许上传图片、文档等安全格式。 - **文件大小限制**:设定上传文件的最大大小,防止大文件占用过多服务器资源。 - **权限控制**:确保只有授权用户能访问上传...
在IT行业中,图片裁剪和上传是常见的功能需求,尤其在网页和移动应用设计中,这一功能至关重要。本文将深入探讨“图片裁剪+上传”的技术实现及其修正版的优化策略。 图片裁剪通常涉及到图像处理领域,它允许用户...
- **跨域问题**:如果涉及到不同源的交互,需要处理CORS(跨源资源共享)设置。 在提供的压缩包文件"UpDownFile"中,可能包含了实现上传下载功能的相关代码示例,这些代码可能涵盖客户端的前端部分以及服务器端的...
配置IIS以支持Fckeditor上传图片,需要在图片服务器上设置相应的IIS应用程序,使其能够响应编辑器的请求。 4. 跨域问题处理:在不同的域之间进行资源的共享或数据的交换时,浏览器出于安全考虑会阻止跨域请求。在...
在PHP中,cURL是一个强大的库,用于与服务器进行交互,它支持多种协议,包括HTTP、FTP等。通过cURL,可以模拟几乎任何类型的网络请求。 1. cURL基础:cURL是客户端URL传输库,它可用于下载文件、上传文件、发送邮件...
- 将jar包复制到Linux服务器,可以通过SSH或FTP工具实现。 2. **前端Vue项目打包**: - 运行`npm run build:prod --report`命令,生成的`dist`文件夹包含前端生产环境的静态资源。 - 同样将`dist`目录复制到...
此外,阿里云提供了各种客户端工具,如命令行工具ossutil、客户端工具、挂盘工具ossfs、FTP工具ossftp,以及针对论坛软件如Discuz、phpwind和WordPress的插件,便于不同场景的使用。 **高可用性和稳定性:** OSS...
- **图片上传**:FCKeditor支持图片上传,用户可以选择本地图片并上传至服务器。你需要在服务器端配置图片存储目录,并在Servlet中处理图片上传请求。 - **链接管理**:用户可以插入链接,编辑器会自动处理HTTP、...
05 FTP之文件上传 06 FTP之断点续传 08 FTP之进度条 09 FTP之cd切换 11 FTP之创建文件夹及MD5校验思路 第33章 01 操作系统历史 02 进程的概念 03 线程的概念 04 线程的调用以及join方法 05 setDaemon方法和继承式...
多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 多线程 多线程案例 主线程与子线程 线程锁 线程之信号量 线程之Event 队列Queue 作业之主机批量管理 第10周 心灵分享 上节回顾 多...
这一特性大大简化了音乐资源的上传流程,用户无需下载到本地再上传,节省了时间和网络资源。同时,FTP扫描还可以实现批量导入,提高音乐库的建立效率。 其次,本地资源扫描功能则方便用户快速整理和添加个人电脑中...
同样地,使用FTP或其他工具将`dist`文件夹整体上传至Linux服务器。 ##### 安装与配置Nginx **3.1 安装Redis** 由于若依平台使用了Redis作为缓存解决方案,因此需要确保Linux服务器上已经安装并启动了Redis服务。 ...
2. 将源代码上传至服务器:使用FTP、SFTP或Git等工具将HTML、CSS、JavaScript及资源文件上传至服务器指定目录。 3. 配置服务器:根据游戏需求,可能需要设置重定向、跨域等HTTP头部信息。 4. 部署完成后,玩家可以...
- 配置FTP站点用于出差员工下载和上传工作文档。 - 同样地,需要在DNS服务器上创建相应的A记录。 #### 跨域访问的配置 - **多域环境** - 案例涉及两个域:benet.com.cn 和 project.lcom。 - 为了实现benet域的...
将打包后的文件上传到目标服务器的指定目录下,通常使用FTP、SCP或类似的工具进行文件传输。确保上传过程中文件的完整性和一致性。 九、处理跨域问题 如果项目涉及到跨域请求,可能需要在服务器端配置反向代理,...