Apache CXF实战之七 使用Web Service传输文件

本文介绍如何使用 Apache CXF 实现文件的上传和下载功能,包括自定义 MyFile 类来封装文件路径和字节数据,定义 WebService 接口及其实现类进行文件传输操作,以及 Server 和 Client 类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文链接:http://blog.youkuaiyun.com/kongxx/article/details/7540930

Apache CXF实战之一 Hello World Web Service

Apache CXF实战之二 集成Sping与Web容器

Apache CXF实战之三 传输Java对象

Apache CXF实战之四 构建RESTful Web Service

Apache CXF实战之五 压缩Web Service数据

Apache CXF实战之六 创建安全的Web Service

首先声明我知道有个协议叫ftp,也知道有种编程叫sock编程,但我就是碰到了server对外只开放80端口,并且还需要提供文件上传和下载功能的应用,那好吧,开始干活。

1. 首先是一个封装了服务器端文件路径,客户端文件路径和要传输的字节数组的MyFile类。

  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. public class MyFile {
  3. private String clientFile;
  4. private String serverFile;
  5. private long position;
  6. private byte[] bytes;
  7. public String getClientFile() {
  8. return clientFile;
  9. }
  10. public void setClientFile(String clientFile) {
  11. this.clientFile = clientFile;
  12. }
  13. public String getServerFile() {
  14. return serverFile;
  15. }
  16. public void setServerFile(String serverFile) {
  17. this.serverFile = serverFile;
  18. }
  19. public long getPosition() {
  20. return position;
  21. }
  22. public void setPosition(long position) {
  23. this.position = position;
  24. }
  25. public byte[] getBytes() {
  26. return bytes;
  27. }
  28. public void setBytes(byte[] bytes) {
  29. this.bytes = bytes;
  30. }
  31. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;


public class MyFile {
	
	private String clientFile;
	
	private String serverFile;
	
	private long position;
	
	private byte[] bytes;

	public String getClientFile() {
		return clientFile;
	}

	public void setClientFile(String clientFile) {
		this.clientFile = clientFile;
	}

	public String getServerFile() {
		return serverFile;
	}

	public void setServerFile(String serverFile) {
		this.serverFile = serverFile;
	}

	public long getPosition() {
		return position;
	}

	public void setPosition(long position) {
		this.position = position;
	}

	public byte[] getBytes() {
		return bytes;
	}

	public void setBytes(byte[] bytes) {
		this.bytes = bytes;
	}
}
2. 文件传输的Web Service接口

  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. @WebService
  5. public interface FileTransferService {
  6. @WebMethod
  7. void uploadFile(MyFile myFile) throws FileTransferException;
  8. @WebMethod
  9. MyFile downloadFile(MyFile myFile) throws FileTransferException;
  10. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public interface FileTransferService {
	
	@WebMethod
	void uploadFile(MyFile myFile) throws FileTransferException;

	@WebMethod
	MyFile downloadFile(MyFile myFile) throws FileTransferException;
}
3. 文件传输的Web Service接口实现类,主要是一些流的操作

  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.util.Arrays;
  8. import org.apache.commons.io.FileUtils;
  9. import org.apache.commons.io.IOUtils;
  10. public class FileTransferServiceImplimplements FileTransferService {
  11. public void uploadFile(MyFile myFile)throws FileTransferException {
  12. OutputStream os = null;
  13. try {
  14. if (myFile.getPosition() != 0) {
  15. os = FileUtils.openOutputStream(new File(myFile.getServerFile()),true);
  16. } else {
  17. os = FileUtils.openOutputStream(new File(myFile.getServerFile()),false);
  18. }
  19. os.write(myFile.getBytes());
  20. } catch(IOException e) {
  21. throw new FileTransferException(e.getMessage(), e);
  22. } finally {
  23. IOUtils.closeQuietly(os);
  24. }
  25. }
  26. public MyFile downloadFile(MyFile myFile) throws FileTransferException {
  27. InputStream is = null;
  28. try {
  29. is = new FileInputStream(myFile.getServerFile());
  30. is.skip(myFile.getPosition());
  31. byte[] bytes = new byte[1024 * 1024];
  32. int size = is.read(bytes);
  33. if (size > 0) {
  34. byte[] fixedBytes = Arrays.copyOfRange(bytes,0, size);
  35. myFile.setBytes(fixedBytes);
  36. } else {
  37. myFile.setBytes(new byte[0]);
  38. }
  39. } catch(IOException e) {
  40. throw new FileTransferException(e.getMessage(), e);
  41. } finally {
  42. IOUtils.closeQuietly(is);
  43. }
  44. return myFile;
  45. }
  46. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

public class FileTransferServiceImpl implements FileTransferService {

    public void uploadFile(MyFile myFile) throws FileTransferException {
        OutputStream os = null;
        
        try {
            if (myFile.getPosition() != 0) {
                os = FileUtils.openOutputStream(new File(myFile.getServerFile()), true);
            } else {
                os = FileUtils.openOutputStream(new File(myFile.getServerFile()), false);
            }
            os.write(myFile.getBytes());
        } catch(IOException e) {
            throw new FileTransferException(e.getMessage(), e);
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

    public MyFile downloadFile(MyFile myFile) throws FileTransferException {
        InputStream is = null;
        
        try {
            is = new FileInputStream(myFile.getServerFile());
            is.skip(myFile.getPosition());
            byte[] bytes = new byte[1024 * 1024];
            int size = is.read(bytes);
            if (size > 0) {
                byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);
                myFile.setBytes(fixedBytes);
            } else {
                myFile.setBytes(new byte[0]);
            }
        } catch(IOException e) {
            throw new FileTransferException(e.getMessage(), e);
        } finally {
            IOUtils.closeQuietly(is);
        }
        return myFile;
    }
}
4. 一个简单的文件传输异常类
  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. public class FileTransferExceptionextends Exception {
  3. private staticfinal long serialVersionUID = 1L;
  4. public FileTransferException() {
  5. super();
  6. }
  7. public FileTransferException(String message, Throwable cause) {
  8. super(message, cause);
  9. }
  10. public FileTransferException(String message) {
  11. super(message);
  12. }
  13. public FileTransferException(Throwable cause) {
  14. super(cause);
  15. }
  16. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;

public class FileTransferException extends Exception {

	private static final long serialVersionUID = 1L;

	public FileTransferException() {
		super();
	}

	public FileTransferException(String message, Throwable cause) {
		super(message, cause);
	}

	public FileTransferException(String message) {
		super(message);
	}

	public FileTransferException(Throwable cause) {
		super(cause);
	}
}
5. 下面是Server类用来发布web service
  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. import javax.xml.ws.Endpoint;
  3. public class FileTransferServer {
  4. public staticvoid main(String[] args) throws Exception {
  5. Endpoint.publish("http://localhost:9000/ws/jaxws/fileTransferService",new FileTransferServiceImpl());
  6. }
  7. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;

import javax.xml.ws.Endpoint;

public class FileTransferServer {
	
	public static void main(String[] args) throws Exception {
		Endpoint.publish("http://localhost:9000/ws/jaxws/fileTransferService", new FileTransferServiceImpl());
	}
}
6. 最后是Client类,用来发送文件上传和下载请求。
  1. package com.googlecode.garbagecan.cxfstudy.filetransfer;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.util.Arrays;
  8. import org.apache.commons.io.FileUtils;
  9. import org.apache.commons.io.IOUtils;
  10. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  11. public class FileTransferClient {
  12. private static final String address = "http://localhost:9000/ws/jaxws/fileTransferService";
  13. private static final String clientFile = "/home/fkong/temp/client/test.zip";
  14. private staticfinal String serverFile = "/home/fkong/temp/server/test.zip";
  15. public staticvoid main(String[] args) throws Exception {
  16. long start = System.currentTimeMillis();
  17. // uploadFile();
  18. // downloadFile();
  19. long stop = System.currentTimeMillis();
  20. System.out.println("Time: " + (stop - start));
  21. }
  22. private staticvoid uploadFile() throws FileTransferException {
  23. InputStream is = null;
  24. try {
  25. MyFile myFile = new MyFile();
  26. is = new FileInputStream(clientFile);
  27. byte[] bytes = new byte[1024 * 1024];
  28. while (true) {
  29. int size = is.read(bytes);
  30. if (size <= 0) {
  31. break;
  32. }
  33. byte[] fixedBytes = Arrays.copyOfRange(bytes,0, size);
  34. myFile.setClientFile(clientFile);
  35. myFile.setServerFile(serverFile);
  36. myFile.setBytes(fixedBytes);
  37. uploadFile(myFile);
  38. myFile.setPosition(myFile.getPosition() + fixedBytes.length);
  39. }
  40. } catch(IOException e) {
  41. throw new FileTransferException(e.getMessage(), e);
  42. } finally {
  43. IOUtils.closeQuietly(is);
  44. }
  45. }
  46. private staticvoid uploadFile(MyFile myFile) throws FileTransferException {
  47. JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
  48. factoryBean.setAddress(address);
  49. factoryBean.setServiceClass(FileTransferService.class);
  50. Object obj = factoryBean.create();
  51. FileTransferService service = (FileTransferService) obj;
  52. service.uploadFile(myFile);
  53. }
  54. private staticvoid downloadFile() throws FileTransferException {
  55. MyFile myFile = new MyFile();
  56. myFile.setServerFile(serverFile);
  57. long position = 0;
  58. while (true) {
  59. myFile.setPosition(position);
  60. myFile = downloadFile(myFile);
  61. if (myFile.getBytes().length <= 0) {
  62. break;
  63. }
  64. OutputStream os = null;
  65. try {
  66. if (position != 0) {
  67. os = FileUtils.openOutputStream(new File(clientFile),true);
  68. } else {
  69. os = FileUtils.openOutputStream(new File(clientFile),false);
  70. }
  71. os.write(myFile.getBytes());
  72. } catch(IOException e) {
  73. throw new FileTransferException(e.getMessage(), e);
  74. } finally {
  75. IOUtils.closeQuietly(os);
  76. }
  77. position += myFile.getBytes().length;
  78. }
  79. }
  80. private static MyFile downloadFile(MyFile myFile)throws FileTransferException {
  81. JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
  82. factoryBean.setAddress(address);
  83. factoryBean.setServiceClass(FileTransferService.class);
  84. Object obj = factoryBean.create();
  85. FileTransferService service = (FileTransferService) obj;
  86. return service.downloadFile(myFile);
  87. }
  88. }
package com.googlecode.garbagecan.cxfstudy.filetransfer;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class FileTransferClient {
    
    private static final String address = "http://localhost:9000/ws/jaxws/fileTransferService";
    
    private static final String clientFile = "/home/fkong/temp/client/test.zip";
    private static final String serverFile = "/home/fkong/temp/server/test.zip";
    
    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
//      uploadFile();
//      downloadFile();
        long stop = System.currentTimeMillis();
        System.out.println("Time: " + (stop - start));
    }
    
    private static void uploadFile() throws FileTransferException {
        InputStream is = null;
        try {
            MyFile myFile = new MyFile();
            is = new FileInputStream(clientFile);
            byte[] bytes = new byte[1024 * 1024];
            while (true) {
                int size = is.read(bytes);
                if (size <= 0) {
                    break;
                }
                
                byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);
                myFile.setClientFile(clientFile);
                myFile.setServerFile(serverFile);
                myFile.setBytes(fixedBytes);
                
                uploadFile(myFile);
                
                myFile.setPosition(myFile.getPosition() + fixedBytes.length);
            }
        } catch(IOException e) {
            throw new FileTransferException(e.getMessage(), e);
        } finally {
            IOUtils.closeQuietly(is);
        }
    }
    
    private static void uploadFile(MyFile myFile) throws FileTransferException {
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setAddress(address);
        factoryBean.setServiceClass(FileTransferService.class);
        Object obj = factoryBean.create();

        FileTransferService service = (FileTransferService) obj;
        service.uploadFile(myFile);
    }
    
    private static void downloadFile() throws FileTransferException {
        MyFile myFile = new MyFile();
        myFile.setServerFile(serverFile);
        long position = 0;
        while (true) {
            myFile.setPosition(position);
            myFile = downloadFile(myFile);
            if (myFile.getBytes().length <= 0) {
                break;
            }
            
            OutputStream os = null;
            try {
                if (position != 0) {
                    os = FileUtils.openOutputStream(new File(clientFile), true);
                } else {
                    os = FileUtils.openOutputStream(new File(clientFile), false);
                }
                os.write(myFile.getBytes());
            } catch(IOException e) {
                throw new FileTransferException(e.getMessage(), e);
            } finally {
                IOUtils.closeQuietly(os);
            }
            
            position += myFile.getBytes().length;
        }
    }
    
    private static MyFile downloadFile(MyFile myFile) throws FileTransferException {
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setAddress(address);
        factoryBean.setServiceClass(FileTransferService.class);
        Object obj = factoryBean.create();

        FileTransferService service = (FileTransferService) obj;
        return service.downloadFile(myFile);
    }
}
首先需要准备一个大一点的文件,然后修改代码中的clientFile和serverFile路径,然后分别打开uploadFile和downloadFile注释,运行程序,检查目标文件查看结果。

这个程序还是比较简单的,但基本生完成了文件上传下载功能,如果需要,也可以对这个程序再做点修改使其支持断点续传。

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值