首页 > 解决方案 > 使用 pysmb 将 pdf 文件发送到远程共享文件夹

问题描述

我正在尝试编写一个允许我将本地 pdf 文件发送到远程网络共享的函数。

它需要在 python 中,因为我想稍后使用代码在 django 中使用它作为模型的函数。pysmb 提供以下功能

storeFile(service_name, path, file_obj, timeout=30)

将 file_obj 的内容存储在 service_name 上的路径中。如果文件已经存在于远程服务器上,它将被截断并覆盖。

参数

service_name(string/unicode) – 路径的共享文件夹的名称

path(string/unicode) – 远程服务器上文件的路径。如果路径中的文件不存在,则会创建该文件。否则,它将被覆盖。如果路径指向文件夹或无法打开文件进行写入,则会引发 OperationFailure。

file_obj– 具有读取方法的类文件对象。数据将从 file_obj 连续读取,直到 EOF。

返回
上传的字节数

我还不知道如何解决这个问题。或者更确切地说,我必须解决两个子问题

  1. 将 pdf - 文件放入file_obj
  2. 正确判断service_namepath

1:我发现该软件包shutil不太可能工作,因为它是为机器内的本地操作而设计的。在这种情况下适合什么?我已经看到一个图表,从客户端到主机总是有读写,反之亦然,但它实际上是如何使用 pdf 完成的?读取和写入 pdf 文件并不像使用 .txt - 文件那么容易。

对于 2:我在远程 windows 机器上的 pdf 文件的完整路径是(即我在远程 windows 机器上用右键单击-> 属性检查):

abc123.example.com/shared_folder/shared_files_with_all/PersonA/mypdf.pdf

service_name应该是目录的名字path 所以我选择了:

service_name = "shared_folder"

path = shared_files_with_all/PersonA/

一个。我是否需要像使用 Windows 一样使用两个反斜杠“\\”?

湾。我收到以下错误service_namepath

smb.smb_structs.OperationFailure: Failed to list path on service_name: Unable to connect to shared device

这里有关于这个错误的说法。但是不幸的是,我尝试了它并没有帮助。

最后是我的代码:

import tempfile
from smb.SMBConnection import SMBConnection

# There will be some mechanism to capture userID, password, client_machine_name, server_name and server_ip
# client_machine_name can be an arbitary ASCII string
# server_name should match the remote machine name, or else the connection will be rejected

userID = "userid"
password = "mysecretpassword"
client_machine_name = "clientname"
server_name = "abc123.example.com"
service_name = "shared_folder"
path = "shared_files_with_all/PersonA/"
ip = "xxx.xxx.xxx.xxx"


conn = SMBConnection(userID, password, client_machine_name, server_name, use_ntlm_v2 = True)
assert conn.connect(ip, port=139)

# Don't know how to put in the pdf in here yet
file_obj = tempfile.NamedTemporaryFile()

conn.storeFile(service_name, path, file_obj, timeout=30)
file_obj.close()

conn.close()

标签: pythonpdfcopypastesmb

解决方案


推荐阅读