PHP SFTP文件传输:解决ssh2.sftp://下载空文件问题

PHP SFTP文件传输:解决ssh2.sftp://下载空文件问题

本文旨在解决php使用`ssh2`扩展通过`ssh2.sftp://` uri从sftp服务器下载文件时,本地文件为空的问题。文章将详细解释导致此问题的原因,并提供两种有效的解决方案:一是利用`stream_copy_to_stream`函数进行流数据复制,二是推荐使用更简洁高效的`ssh2_scp_recv`函数(若服务器支持scp),确保文件内容能够正确传输到本地。

在使用PHP的ssh2扩展与SFTP服务器交互时,开发者可能会遇到一个常见问题:通过ssh2.sftp:// URI打开远程文件流并尝试保存到本地时,最终得到的本地文件却是空的。这通常是由于误解了fopen函数在此上下文中的行为所致。

理解问题:为何下载的文件为空?

原始代码片段如下:

$connection = ssh2_connect('{my server ip}', 22);ssh2_auth_password($connection, '{user}', '{password}');$sftp = ssh2_sftp($connection);$file = "test.txt"; // 本地文件名$remote_path = "/public_html/$file"; // 远程文件路径$target_path = "ssh2.sftp://$sftp" . $remote_path; // 远程文件URI$stream = fopen($target_path, 'r'); // 打开远程文件流fopen($file, "w"); // 打开本地文件用于写入fclose($stream); // 关闭远程文件流

这段代码的问题在于,它确实成功打开了远程文件作为可读流($stream),也成功创建了一个本地文件用于写入。然而,它从未执行将数据从远程流传输到本地文件的操作。fopen函数本身并不会进行数据复制,它只是建立了一个文件句柄或流。因此,在没有数据传输的情况下,本地文件自然会保持为空。

解决方案一:使用stream_copy_to_stream正确传输数据

要解决上述问题,我们需要明确地将数据从打开的远程流复制到打开的本地流。PHP提供了stream_copy_to_stream函数,专门用于此目的。

立即学习“PHP免费学习笔记(深入)”;

stream_copy_to_stream(resource $source, resource $dest, ?int $maxlength = null, int $offset = 0): int|false

这个函数将从$source流中读取数据,并将其写入$dest流中,直到$source流到达末尾,或者复制了$maxlength字节的数据。

以下是使用stream_copy_to_stream的正确实现:


代码解析:

ssh2_connect():建立与SSH服务器的连接。ssh2_auth_password():使用用户名和密码进行身份验证。ssh2_sftp():获取SFTP子系统句柄,这是构建ssh2.sftp:// URI所必需的。fopen($sftp_uri, ‘r’):打开远程SFTP文件,返回一个可读的流资源。fopen($local_file_name, ‘w’):在本地创建一个新文件,并返回一个可写的流资源。stream_copy_to_stream($remote_stream, $local_stream):这是核心步骤,它将远程流中的所有数据读取并写入到本地流中。fclose():在操作完成后,务必关闭所有打开的文件流,释放资源。

解决方案二:更简洁高效的ssh2_scp_recv方法

如果你的服务器同时支持SCP(Secure Copy Protocol),那么PHP的ssh2扩展提供了一个更简洁、更直接的函数ssh2_scp_recv来下载文件。SCP通常与SFTP一同提供,并且在许多情况下,它能提供更快的传输速度。

ssh2_scp_recv(resource $session, string $remote_file, string $local_file): bool

这个函数直接将远程文件复制到本地文件,无需手动处理流。

以下是使用ssh2_scp_recv的示例:


代码解析:

ssh2_connect() 和 ssh2_auth_password():与第一种方法相同,用于建立和验证SSH连接。ssh2_scp_recv($connection, $remote_full_path, $local_file_name):这是核心函数,它接收SSH连接资源、远程文件的完整路径和本地文件的保存路径作为参数,然后直接执行文件复制操作。成功返回true,失败返回false。

注意事项:

ssh2_scp_recv函数要求远程文件路径是服务器上的绝对路径或相对于用户主目录的路径。此方法依赖于服务器是否启用了SCP服务。大多数支持SFTP的服务器也会支持SCP,但并非绝对。ssh2_scp_recv通常比手动处理流更为高效,因为它可能在底层使用了更优化的传输机制。

总结

当使用PHP的ssh2扩展从SFTP服务器下载文件时,切记fopen仅是打开文件流,并不会自动传输数据。为了确保文件内容能够正确下载到本地,你需要:

使用stream_copy_to_stream:这是最通用的方法,适用于所有SFTP连接,通过手动复制远程流数据到本地流。使用ssh2_scp_recv:如果服务器支持SCP,这是更简洁高效的选择,只需一行代码即可完成文件下载。

在实际应用中,建议优先考虑ssh2_scp_recv,因为它代码量少、易于理解和维护。如果遇到SCP不支持的情况,再回退到stream_copy_to_stream方法。同时,务必加入适当的错误处理机制,以应对连接失败、认证失败或文件不存在等异常情况。

以上就是PHP SFTP文件传输:解决ssh2.sftp://下载空文件问题的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1327993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月12日 14:20:09
下一篇 2025年12月12日 14:20:16

相关推荐

  • 揭示绝对定位的缺点并提出解决方案:常见问题的规避策略

    绝对定位的弊端揭秘:如何避免常见问题? 绝对定位是网页设计中常用的一种布局方式,它可以让元素精确地定位在页面上的指定位置。然而,尽管绝对定位在某些情况下非常有用,但它也存在一些弊端。本文将揭示绝对定位的弊端,并提供一些方法来避免常见问题。 首先,绝对定位的一个弊端是元素定位可能受到浏览器窗口大小的影…

    2025年12月24日
    000
  • 常见问题和解决方法:绝对定位运动指令的疑问与解答

    绝对定位运动指令的常见问题及解决方法 摘要:随着技术的不断进步,绝对定位运动在现代机械设备中得到了广泛应用。然而,在使用绝对定位运动指令的过程中,常常会遇到各种问题。本文将重点讨论常见的绝对定位运动指令问题,并提供相应的解决方法和具体的代码示例。 一、绝对定位运动指令简介绝对定位运动指令是指根据目标…

    2025年12月24日
    000
  • 揭秘绝对定位故障:常见问题和解决方法曝光

    绝对定位故障大揭秘:常见问题及解决方案 引言: 绝对定位(Absolute positioning)是CSS中常用的一种定位方式,它允许开发者将元素精确地放置在一个给定的位置上。然而,由于其特殊的性质和较为复杂的用法,绝对定位经常会出现各种问题。本文将揭示绝对定位的常见故障,并提供相应的解决方案,同…

    2025年12月24日
    000
  • 学会从头开始学习CSS,掌握制作基本网页框架的技巧

    从零开始学习CSS,掌握网页基本框架制作技巧 前言: 在现今互联网时代,网页设计和开发是一个非常重要的技能。而学习CSS(层叠样式表)是掌握网页设计的关键之一。CSS不仅可以为网页添加样式和布局,还可以为用户呈现独特且具有吸引力的页面效果。在本文中,我将为您介绍一些基本的CSS知识,以及一些常用的代…

    2025年12月24日
    200
  • 揭秘Web标准涵盖的语言:了解网页开发必备的语言范围

    在当今数字时代,互联网成为了人们生活中不可或缺的一部分。作为互联网的基本构成单位,网页承载着我们获取和分享信息的重要任务。而网页开发作为一门独特的技术,离不开一些必备的语言。本文将揭秘Web标准涵盖的语言,让我们一起了解网页开发所需的语言范围。 首先,HTML(HyperText Markup La…

    2025年12月24日
    000
  • 揭开Web开发的语言之谜:了解构建网页所需的语言有哪些?

    Web标准中的语言大揭秘:掌握网页开发所需的语言有哪些? 随着互联网的快速发展,网页开发已经成为人们重要的职业之一。而要成为一名优秀的网页开发者,掌握网页开发所需的语言是必不可少的。本文将为大家揭示Web标准中的语言大揭秘,介绍网页开发所需的主要语言。 HTML(超文本标记语言)HTML是网页开发的…

    2025年12月24日
    400
  • 常用的网页开发语言:了解Web标准的要点

    了解Web标准的语言要点:常见的哪些语言应用在网页开发中? 随着互联网的不断发展,网页已经成为人们获取信息和交流的重要途径。而要实现一个高质量、易用的网页,离不开一种被广泛接受的Web标准。Web标准的制定和应用,涉及到多种语言和技术,本文将介绍常见的几种语言在网页开发中的应用。 首先,HTML(H…

    2025年12月24日
    000
  • 网页开发中常见的Web标准语言有哪些?

    探索Web标准语言的世界:网页开发中常用的语言有哪些? 在现代社会中,互联网的普及程度越来越高,网页已成为人们获取资讯、娱乐、交流的重要途径。而网页的开发离不开各种编程语言的应用和支持。在这个虚拟世界的网络,有许多被广泛应用的标准化语言,用于为用户提供优质的网页体验。本文将探索网页开发中常用的语言,…

    2025年12月24日
    000
  • 深入探究Web标准语言的范围,涵盖了哪些语言?

    Web标准是指互联网上的各个网页所需遵循的一系列规范,确保网页在不同的浏览器和设备上能够正确地显示和运行。这些标准包括HTML、CSS和JavaScript等语言。本文将深入解析Web标准涵盖的语言范围。 首先,HTML(HyperText Markup Language)是构建网页的基础语言。它使…

    2025年12月24日
    000
  • CSS 超链接属性解析:text-decoration 和 color

    CSS 超链接属性解析:text-decoration 和 color 超链接是网页中常用的元素之一,它能够在不同页面之间建立连接。为了使超链接在页面中有明显的标识和吸引力,CSS 提供了一些属性来调整超链接的样式。本文将重点介绍 text-decoration 和 color 这两个与超链接相关的…

    2025年12月24日
    000
  • 详解Css Flex 弹性布局中的常见问题及解决方案

    详解CSS Flex弹性布局中的常见问题及解决方案 引言:CSS Flex弹性布局是一种现代的布局方式,其具有优雅简洁的语法和强大的灵活性,广泛应用于构建响应式的web页面。然而,在实际应用中,经常会遇到一些常见的问题,如元素排列不如预期、尺寸不一致等。本文将详细介绍这些问题,并提供相应的解决方案,…

    2025年12月24日
    200
  • 看看这些前端面试题,带你搞定高频知识点(一)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:给定一个元素,如何实现水平垂直居中?…

    2025年12月24日 好文分享
    300
  • 看看这些前端面试题,带你搞定高频知识点(二)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:页面导入样式时,使用 link 和 …

    2025年12月24日 好文分享
    200
  • 看看这些前端面试题,带你搞定高频知识点(三)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:清除浮动有哪些方式? 我:呃~,浮动…

    2025年12月24日 好文分享
    000
  • 看看这些前端面试题,带你搞定高频知识点(四)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:请你谈一下自适应(适配)的方案 我:…

    2025年12月24日 好文分享
    000
  • 看看这些前端面试题,带你搞定高频知识点(五)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:css 如何实现左侧固定 300px…

    2025年12月24日 好文分享
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 分享20个首页流行布局样式,总有一款适合你!

    本篇文章给大家分享20个首页流行布局样式,总有一款适合你,快来收藏试试吧,希望对大家有所帮助! 有时我们会在网站上遇到一些内容布局问题,如文字对齐、图片设计与内容和谐、为文章选择合适的字体……在今天的文章中,介绍一些设计精美的创意布局,let‘s  开始。 代号 001 源码…

    2025年12月24日 好文分享
    000
  • css如何让div悬浮于另一个div上

    让div悬浮于另一个div上的方法:1、给两个div元素添加“position:absolute”绝对定位样式;2、给其中一个div元素添加“{top:距离页面顶部距离;left:距离页面左侧距离;}”样式使其浮动在另一个div元素上即可。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日 好文分享
    000
  • css怎样实现字母不到一行就换行

    css字母不到一行就换行的方法:1、给元素添加“word-break:break-word;”样式,使其以单词为单位换行;2、给元素添加“word-break:break-all;”样式,使其以字母为单位换行。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信