Java代码实现文件上传到Linux服务器 (java 文件上传到linux服务器端)

文件上传是在日常应用中非常常见的需要。在许多场合中,我们需要将某个文件传输到服务器上,以便在后续的操作中使用。这种文件上传的需求既可以采用传统的方法进行,比如使用FTP、SCP、SFTP协议等,也可以借助各种语言的网络上传库来实现。本文主要介绍如何使用的功能。

准备工作

在开始介绍具体的实现方式前,我们需要确保已经准备好以下的软件和环境:

– JDK 1.8以上版本。

– Linux服务器(Ubuntu、CentOS、Debian等)。

– 在Linux服务器上配置好SSH服务,并能够通过SSH连接到服务器。

– 在Java代码中引入Jsch库(Java Secure Channel)。

Jsch是一个Java Secure Channel(Java安全通道)的实现,可以提供一个安全通道来传输文件、执行命令等。在本文中,我们使用Jsch库来实现文件上传功能。

文件上传

在Java代码中导入Jsch的jar包。如果使用Maven,则在项目的pom.xml文件中添加如下依赖:

“`

com.jcraft

jsch

0.1.54

“`

接下来,我们开始编写Java代码。

1. 需要建立一个SSH连接。可以使用ch类来创建一个SSH连接,如下所示:

“`java

ch jsch = new ch();

Session session = jsch.getSession(username, host, port);

session.setPassword(password);

session.connect();

“`

其中,username和password分别表示Linux服务器的用户名和密码,host表示服务器的IP地址或者域名,port表示SSH连接的端口号。如果没有指定端口号,则默认为22。

2. 在建立SSH连接后,我们需要实现文件上传功能。在Linux服务器中,我们可以使用SCP协议来实现文件上传。SCP是Secure Copy Protocol(安全拷贝协议)的缩写,可以通过SSH通道安全地传输文件。在Java代码中,可以通过Session对象提供的功能来实现SCP上传。具体实现代码如下:

“`java

String src = “(本地文件路径)”;

String dest = “(服务器文件路径)”;

String command = “scp -p -t ” + dest;

Channel channel = session.openChannel(“exec”);

((ChannelExec) channel).setCommand(command);

OutputStream out = channel.getOutputStream();

InputStream in = channel.getInputStream();

channel.connect();

if (checkAck(in) != 0) {

System.exit(0);

}

File file = new File(src);

long filesize = file.length();

command = “C0644 ” + filesize + ” “;

if (src.lastIndexOf(“/”) > 0) {

command += src.substring(src.lastIndexOf(“/”) + 1);

} else {

command += src;

}

command += “\n”;

out.write(command.getBytes());

out.flush();

if (checkAck(in) != 0) {

System.exit(0);

}

FileInputStream fis = new FileInputStream(src);

byte[] buf = new byte[1024];

while (true) {

int len = fis.read(buf, 0, buf.length);

if (len

out.write(buf, 0, len);

}

fis.close();

out.flush();

command = “exit\n”;

out.write(command.getBytes());

out.flush();

channel.disconnect();

session.disconnect();

“`

在上述代码中,我们定义了两个变量src和dest,分别表示本地文件路径和服务器文件路径。这里采用的是绝对路径的方式。command变量用于定义SCP协议的传输命令,因为SCP协议的实现方式不同于常见的FTP、SFTP等文件传输协议,所以需要专门的传输命令。

在连接建立后,我们创建一个ChannelExec对象来执行SCP命令。然后使用getOutputStream方法获取输出流和getInputStream方法获取输入流。输入流主要用于监听SCP协议传输的反馈信息,输出流则用于写入文件内容。在while循环中,我们读取本地文件内容并通过输出流写入,直到文件传输完成。在我们发送一个退出命令,关闭Channel对象并结束SSH连接。

在上述的实现中,我们还需要实现一个方法用于监听SCP协议的传输反馈信息,如果出现错误,则及时终止传输。这个方法的实现如下:

“`java

private static int checkAck(InputStream in) throws IOException {

int b = in.read();

if (b == 0) return b;

if (b == -1) return b;

if (b == 1 || b == 2) {

StringBuffer = new StringBuffer();

int c;

do {

c = in.read();

.append((char) c);

} while (c != ‘\n’);

if (b == 1) { // 如果是SCP协议错误,则输出对应的错误信息

System.out.println(.toString());

}

if (b == 2) {

System.out.println(.toString());

}

}

return b;

}

“`

在上面的代码中,我们首先从输入流in中读取一个字节,并判断是否结束或是否正常传输。如果出现错误,则读取反馈信息并输出错误信息,最后返回错误码。

3. 我们将整个文件上传类封装起来,这样以后在需要上传文件时只需要调用这个类即可。具体实现代码如下:

“`java

public class FileUploader {

private static final String DEFAULT_PASSWORD = “”; // 服务器密码

private static final String DEFAULT_USERNAME = “”; // 服务器用户名

private static final int DEFAULT_PORT = 22; // SSH默认端口

/**

* 文件上传

* @param localFilePath 本地文件路径

* @param remoteFilePath 服务器文件路径

* @param serverIP 服务器地址

* @param username 服务器用户名

* @param password 服务器密码

* @param port SSH端口

* @throws chException

* @throws IOException

*/

public static void upload(String localFilePath, String remoteFilePath,

String serverIP, String username, String password, int port)

throws chException, IOException {

ch jsch = new ch();

Session session = jsch.getSession(username, serverIP, port);

session.setPassword(password);

session.connect();

String command = “scp -p -t ” + remoteFilePath;

Channel channel = session.openChannel(“exec”);

((ChannelExec) channel).setCommand(command);

OutputStream out = channel.getOutputStream();

InputStream in = channel.getInputStream();

channel.connect();

if (checkAck(in) != 0) {

System.exit(0);

}

File file = new File(localFilePath);

long filesize = file.length();

command = “C0644 ” + filesize + ” “;

if (localFilePath.lastIndexOf(“/”) > 0) {

command += localFilePath.substring(localFilePath.lastIndexOf(“/”) + 1);

} else {

command += localFilePath;

}

command += “\n”;

out.write(command.getBytes());

out.flush();

if (checkAck(in) != 0) {

System.exit(0);

}

FileInputStream fis = new FileInputStream(localFilePath);

byte[] buf = new byte[1024];

while (true) {

int len = fis.read(buf, 0, buf.length);

if (len

out.write(buf, 0, len);

}

fis.close();

out.flush();

command = “exit\n”;

out.write(command.getBytes());

out.flush();

channel.disconnect();

session.disconnect();

}

/**

* 文件上传

* @param localFile 本地文件

* @param remoteFilePath 服务器文件路径

* @param serverIP 服务器地址

* @param username 服务器用户名

* @param password 服务器密码

* @param port SSH端口

* @throws chException

* @throws IOException

*/

public static void upload(File localFile, String remoteFilePath,

String serverIP, String username, String password, int port)

throws chException, IOException {

upload(localFile.getPath(), remoteFilePath, serverIP, username, password, port);

}

/**

* 文件上传

* @param localFilePath 本地文件路径

* @param remoteFilePath 服务器文件路径

* @param serverIP 服务器地址

* @throws chException

* @throws IOException

*/

public static void upload(String localFilePath, String remoteFilePath, String serverIP)

throws chException, IOException {

upload(localFilePath, remoteFilePath, serverIP, DEFAULT_USERNAME, DEFAULT_PASSWORD, DEFAULT_PORT);

}

/**

* 文件上传

* @param localFile 本地文件

* @param remoteFilePath 服务器文件路径

* @param serverIP 服务器地址

* @throws chException

* @throws IOException

*/

public static void upload(File localFile, String remoteFilePath, String serverIP)

throws chException, IOException {

upload(localFile.getPath(), remoteFilePath, serverIP, DEFAULT_USERNAME, DEFAULT_PASSWORD, DEFAULT_PORT);

}

}

“`

在上述代码中,我们封装了四个不同的文件上传方法。在大多数情况下,使用默认值即可。只有在服务器用户名、密码或SSH端口与默认值不同的情况下,需要使用其中的某个方法。

在本文中,我们介绍了如何使用的功能。在实现过程中,我们使用了Jsch库和SCP协议,通过SSH通道来传输文件。在实际应用中,文件上传是非常常见的需求,使用本文中的代码,可以轻松地实现该功能。如果读者在实现过程中遇到问题,可以参考Jsch库的文档或者留言询问。

相关问题拓展阅读:

  • 用java写一个上传程序到linux服务器上,服务器上有权限,如果不能创建文件夹及文件,抛异常.

用java写一个上传程序到linux服务器上,服务器上有权限,如果不能创建文件夹及文件,抛异常.

public static void main(String args){

try {

File file = new File(“test/pp/tt/asd.txt”);

File parent = file.getParentFile();

if(parent!=null&&!parent.exists()){

parent.mkdirs();

}

file.createNewFile();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

关于java 文件上传到linux服务器端的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/214770.html<

(0)
管理的头像管理
上一篇2025-04-11 22:55
下一篇 2025-04-11 22:57

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注