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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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