ftp相关方法,下载没写完

package com.roiland.cms.util;


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;


import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.springframework.web.multipart.MultipartFile;


public class Ftpclient {


public enum UploadStatus { 
Create_Directory_Fail,   //远程服务器相应目录创建失败 
Create_Directory_Success, //远程服务器闯将目录成功 
Upload_New_File_Success, //上传新文件成功 
Upload_New_File_Failed,   //上传新文件失败 
File_Exits,      //文件已经存在 
Remote_Bigger_Local,   //远程文件大于本地文件 
Upload_From_Break_Success, //断点续传成功 
Upload_From_Break_Failed, //断点续传失败 
Delete_Remote_Faild;   //删除远程文件失败 


/**

* @Title: uploadFile
* @Description: TODO 上传图片文件
* @param targetpath
*            上传文件目标路径
* @param instream
*            上传文件流
* @param fileOldName
*            上传的文件名,包括后缀,需要重命名
* @param directory
*            要删除的文件,包含文件名称(全路径),没有给null
* @return
* @return Map<String,Object> 返回类型
* @throws
*/
@SuppressWarnings("static-access")
public static Map<String, Object> uploadFile(String targetpath, InputStream instream, String fileOldName, String directory, FTPClient ftp) {


boolean flag = true;
Map<String, Object> map = new HashMap<String, Object>();
if (ftp != null) {
try {
// 原文件后缀
String fname = fileOldName.substring(fileOldName.lastIndexOf(".") + 1, fileOldName.length()).toLowerCase();
// 如果不符合,则退出
if (!fname.equalsIgnoreCase("png") && !fname.equalsIgnoreCase("jpg") && !fname.equalsIgnoreCase("bmp") && !fname.equalsIgnoreCase("jpeg")
&& !fname.equalsIgnoreCase("gif")) {
map.put("message", "图片:" + fileOldName + " 上传格式不正确!");
map.put("success", false);
return map;
}
// 新文件名
String fileNewName = UUID.randomUUID().toString() + "." + fname;


if (targetpath != null && !"".equals(targetpath)) {
ftp.changeWorkingDirectory("/");
if (!ftp.changeWorkingDirectory(targetpath)) { // 如果新文件夹不存在


if (!makeDirectory(targetpath, ftp)) {// 创建文件夹
map.put("success", false);
return map;
} else {
ftp.changeWorkingDirectory(targetpath); // 更改ftp目录
}
}
}


ftp.setFileType(ftp.BINARY_FILE_TYPE);
flag = ftp.storeFile(fileNewName, instream); // 上传文件
if (flag) {
map.put("success", true);
map.put("path", targetpath+fileNewName);
map.put("imgname", fileNewName);
map.put("message", "上传成功");


if (directory != null && !"".equals(directory)) {
// 删除文件
if (!deleteFiles(directory, ftp)) {
map.put("success", false);
map.put("message", "删除失败");
}
}
} else {
map.put("success", false);
map.put("message", "上传失败");
return map;
}
} catch (IOException e) {
e.printStackTrace();
return map;
}
return map;
} else {
map.put("success", false);
map.put("message", "ftp is null");
return map;
}
}


/**

* @Title: deletDirectory
* @Description: TODO 删除文件夹
* @param dirpath
*            文件夹路径
* @return
* @return boolean 返回类型
* @throws
*/
public static boolean deletDirectory(String dirpath, FTPClient ftp) {
if (ftp != null) {
try {
ftp.changeWorkingDirectory("/"); // 删除文件夹只需要切换到根目录即可,不要切换到删除文件夹下


FTPFile[] file = ftp.listFiles(dirpath);
for (FTPFile ftpFile : file) {
if (ftpFile.isFile()) {
ftp.deleteFile(dirpath + "/" + ftpFile.getName());
}
if (ftpFile.isDirectory()) {
deletDirectory(dirpath + "/" + ftpFile.getName(), ftp);
ftp.removeDirectory(dirpath + "/" + ftpFile.getName());
}
}


ftp.removeDirectory(dirpath);
FTPFile[] file1 = ftp.listFiles(dirpath);
if (file1.length > 0) {
return false;
} else {
return true;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
}


/**

* @Title: deleteFiles
* @Description: TODO 删除文件
* @param filePath
*            删除文件全路径包含文件名及后缀
* @return
* @return boolean 返回类型
* @throws
*/
public static boolean deleteFiles(String filePath, FTPClient ftp) {
boolean flag = true;
if (ftp != null) {
try {
int res = filePath.lastIndexOf("/");
String name = filePath.substring(res + 1);
ftp.changeWorkingDirectory("/");// 回到根目录


if (res != -1) { // 如果等于-1,路径为ftp跟目录


String path = filePath.substring(0, res);
if (ftp.changeWorkingDirectory(path)) {


flag = ftp.deleteFile(name);// 删除文件
} else {
flag = false;// 切换失败,文件夹不存在
}
} else {
flag = ftp.deleteFile(name);// 删除文件
}
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
} else {
flag = false;
}
return flag;
}


/**

* @Title: makeDirectory
* @Description: TODO FTP创建文件夹
* @param dirPathName
*            文件夹路径
* @param ftp
*            FTP
* @return
* @return boolean 返回类型
* @throws
*/
public static boolean makeDirectory(String dirPathName, FTPClient ftp) {


boolean flag = true;
if (ftp != null) {
try {
ftp.changeWorkingDirectory("/");
flag = ftp.makeDirectory(dirPathName);
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
} else {
flag = false;
}
return flag;
}


/**

* @Title: connectService
* @Description: TODO 打开FTP连接
* @return FTPClient
* @return boolean 返回类型
* @throws
*/
public static FTPClient connectService() {


FTPClient ftp = new FTPClient();


String IP = "192.168.1.128"; // IP
int port = 21; // 端口
String username = "audionline"; // 用户名
String userpass = "p@ssWORD"; // 密码


try {
ftp.setControlEncoding("UTF-8");
// ftp.setDataTimeout(120000);//连接超时时间
ftp.setBufferSize(1024 * 10);
ftp.setDefaultPort(port);
ftp.connect(IP);
ftp.login(username, userpass);


int reply = ftp.getReplyCode(); // 230为连接成功
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.logout();
ftp.disconnect();
System.err.println("FTP server refused connection.");
ftp = null;
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ftp;
}


/**

* @Title: closeConnect
* @Description: TODO 关闭ftp连接
* @return void 返回类型
* @throws
*/
public static void closeConnect(FTPClient ftp) {
try {
if (ftp != null) {
ftp.logout();
ftp.disconnect();
System.err.println("FTP CLOSE");
}
} catch (Exception e) {
e.printStackTrace();
}
}


/**

* @Title: uploadFile
* @Description: TODO 断点续传方法
* @param remoteFilePath
*            上传到服务器的路径
* @param ftp
* @param file
*            文件流
* @return
* @return boolean 返回类型
* @throws
*/
public static Map<String, Object> pointuploadFile(String remoteFilePath, FTPClient ftp, MultipartFile file) {
Map<String, Object> map = new HashMap<String, Object>();
try {
long localFileSize = file.getSize(); // 获取上传文件大小
String remoteFileName = file.getOriginalFilename();

// 原文件后缀
String fname = remoteFileName.substring(remoteFileName.lastIndexOf(".") + 1, remoteFileName.length()).toLowerCase();
// 如果不符合,则退出
if (!fname.equalsIgnoreCase("mp4") && !fname.equalsIgnoreCase("avi") && !fname.equalsIgnoreCase("bmp") && !fname.equalsIgnoreCase("rmvb")
&& !fname.equalsIgnoreCase("wmv")) {
map.put("message", "视频:" + remoteFileName + " 上传格式不正确!");
map.put("success", false);
return map;
}


ftp.changeWorkingDirectory("/");
if (remoteFilePath != null && !"".equals(remoteFilePath)) { // 上传到服务器的路径不为空
if (!ftp.changeWorkingDirectory(remoteFilePath)) { // 切换失败说明文件夹不存在,
if (makeDirectory(remoteFilePath, ftp)) { // 创建文件夹
if(ftp.changeWorkingDirectory(remoteFilePath)){

return breakpintUpload(ftp, remoteFileName, localFileSize, file);
}else{
map.put("message", "更改服务器路径错误!");
map.put("success", false);
return map;
}


} else {
map.put("message", "创建文件夹失败!");
map.put("success", false);
return map;// 文件夹创建失败
}
} else {
return breakpintUpload(ftp, remoteFileName, localFileSize, file);
}
} else { // 上传到服务器路径为空,则传到服务器根目录下
return breakpintUpload(ftp, remoteFileName, localFileSize, file);
}


} catch (IOException e) {
e.printStackTrace();
map.put("message", "异常错误!");
map.put("success", false);
return map;// 文件夹创建失败
}


}


/**

* @Title: judgeFile
* @Description: TODO 判断文件是否存在并断点上传,执行前提FTP已经切换到指定的工作目录
* @param ftp
* @param remoteFileName  上传到服务器上文件名称
* @return
* @return long 返回类型 ,返回文件字节大小
* @throws
*/
private  static Map<String, Object> breakpintUpload(FTPClient ftp, String remoteFileName, long localFileSize, MultipartFile file) {
long remoteFileSize = 0;
boolean result = true;
Map<String, Object> map = new HashMap<String, Object>();
try {

//remoteFileName = new String(remoteFileName.getBytes("UTF-8"));
ftp.setFileType(ftp.BINARY_FILE_TYPE);
FTPFile[] fi = ftp.listFiles(remoteFileName);
InputStream instream = file.getInputStream();

if (fi.length == 1) { // 有同名文件
remoteFileSize = fi[0].getSize();
if (remoteFileSize == localFileSize) {
map.put("message", "文件存在!");
map.put("success", false);
return map;// 文件已经存在
} else if (remoteFileSize > localFileSize) {
map.put("message", "服务器存在同名文件并大于上传文件!");
map.put("success", false);
return map;// 服务器文件大于上传文件
}


// 断点续传上传文件
if (instream.skip(remoteFileSize) == remoteFileSize) {
ftp.setRestartOffset(remoteFileSize);
if (ftp.storeFile(remoteFileName, instream)) {
map.put("message", "断点上传成功!");
map.put("success", true);
return map;
}
}


// 如果断点续传没有成功,则删除服务器上文件,重新上传
if (!ftp.deleteFile(remoteFileName)) {
map.put("message", "删除失败!");
map.put("success", false);
return map;// 删除失败
}


instream = file.getInputStream(); // 从新获取文件流


if (ftp.storeFile(remoteFileName, instream)) {
map.put("message", "断点上传成功!");
map.put("success", true);

} else {
map.put("message", "断点上传失败!");
map.put("success", false);

}
instream.close();


} else {// 没有同名文件
if (ftp.storeFile(remoteFileName, instream)) {
//ftp.rename(renameFile(remoteFileName), remoteFileName); //文件重命名
map.put("message", "上传成功!");
map.put("success", true);
} else {
map.put("message", "上传失败!");
map.put("success", false);
}
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
map.put("message", "异常错误!");
map.put("success", false);
}
return map;
}


/**

* @Title: renameFile 
* @Description: TODO文件重命名
* @param fileName原文件名
* @return 
* @return String    返回类型 
* @throws
*/
public static String renameFile(String fileName){
String suffix = fileName.substring(fileName.lastIndexOf("."));
String newName = UUID.randomUUID().toString()+"."+suffix;
return newName;
}

/**

* @Title: downloadFile 
* @Description: TODO  文件下载
* @param response
* @param request
* @throws Exception 
* @return void    返回类型 
* @throws
*/
public static void downloadFile(HttpServletResponse response, HttpServletRequest request, String uploadPath) throws Exception {
response.reset();
File file = new File("D:\\image\\ul\\li\\年会第九版.mpg");


InputStream is = new FileInputStream(file);
BufferedOutputStream out = null;
// 文件名
String filename = encodeChineseDownloadFileName(request, file.getName());
try {


response.setHeader("Accept-Ranges", "bytes");
// response.setHeader("ETag", "\"" + eTag + "\"");//续传必须
response.setHeader("Content-Length", file.length() + "");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream;charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=" + filename);
byte[] buffer = new byte[1024];
int len;
boolean full = false;
// 读取,输出流
out = new BufferedOutputStream(response.getOutputStream());
while ((len = is.read(buffer)) > 0) {

out.write(buffer, 0, len);
out.flush();
}

} finally {


if (is != null)
is.close();
}
if (out != null) {
out.close();
}


}

/** 
     * 下载服务器已存在的文件 
     *  
     * @param request 
     * @param response 
     * @param proposeFile 
     * @throws IOException 
     * @throws FileNotFoundException 
     */  
    public void downloads(HttpServletRequest request,HttpServletResponse response)  {  
    ServletOutputStream out = null;
    BufferedOutputStream bufferOut = null;
    InputStream inputStream = null;
    try {
File file = new File("D:\\image\\ul\\li\\年会第九版.mpg");
long fSize =file.length();  
// 下载
response.setContentType("application/x-download");  
response.setCharacterEncoding("UFT-8");
String isoFileName = encodeChineseDownloadFileName(request, file.getName());
response.setHeader("Accept-Ranges", "bytes");  
response.setHeader("Content-Length", String.valueOf(fSize));  
response.setHeader("Content-Disposition", "attachment; filename="  
       + isoFileName);  
long pos = 0;  
if (null != request.getHeader("Range")) {  
   // 断点续传  
   response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);  
   try {  
       pos = Long.parseLong(request.getHeader("Range").replaceAll(  
               "bytes=", "").replaceAll("-", ""));  
   } catch (NumberFormatException e) {  
       pos = 0;  
   }  
}  
out = response.getOutputStream();  
bufferOut = new BufferedOutputStream(out);  
inputStream = new FileInputStream(file);  
String contentRange = new StringBuffer("bytes ").append(  
       new Long(pos).toString()).append("-").append(  
       new Long(fSize - 1).toString()).append("/").append(  
       new Long(fSize).toString()).toString();  
response.setHeader("Content-Range", contentRange);  
inputStream.skip(pos);  
byte[] buffer = new byte[5 * 1024];  
int length = 0;  
while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {  
   bufferOut.write(buffer, 0, length);  
   bufferOut.flush(); 
}  

} catch (IOException e) {
System.out.println("下载异常");
e.printStackTrace();
}  finally{
try {
 
bufferOut.close();  
out.close();  
inputStream.close();
} catch (Exception e) {
System.out.println("下载关闭异常");
e.printStackTrace();
}
}
    }
    
    
    public  void domnloadfile(HttpServletRequest request,HttpServletResponse response){
   
    BufferedOutputStream buffer =  null;
    InputStream is = null;
    OutputStream os = null;
    try {

    URL url = new URL("");
    URLConnection con = (URLConnection) url.getContent();
    is =con.getInputStream();
   
} catch (Exception e) {
// TODO: handle exception
}
    }
    
    
    /** 
    * 对文件流输出下载的中文文件名进行编码 屏蔽各种浏览器版本的差异性 
    */ 
private static String encodeChineseDownloadFileName(HttpServletRequest request, String pFileName) {
String agent = request.getHeader("USER-AGENT");
try {
if (null != agent && -1 != agent.indexOf("MSIE")) {
pFileName = URLEncoder.encode(pFileName, "utf-8");
} else {
pFileName = new String(pFileName.getBytes("utf-8"), "iso8859-1");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pFileName;

    

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值