2012-10-02 81 views
0

我正在尝试创建可以存储在外部服务器上的PDF。如何在不触摸硬盘的情况下创建文件?

我这样做:

File.new("temp.pdf", "w").close 
    File.open("temp.pdf", "wb") do |f| 
     f.write(bytes) 
    end 
    File.open("temp.pdf", "r") do |f| 
     # upload `f` to server 
    end 
    File.delete("temp.pdf") 

然后将它们上传到服务器。

在我的本地机器上,这工作正常,但是,我最近尝试在另一台机器上运行,并且在日志中出现权限错误。

有没有一种办法:

  1. 写字节的文件。
  2. 切勿触摸硬盘。
+1

我想你在这里得出结论。如何解决根本问题---权限错误? – erjiang

+0

,因为我不需要将文件存储在机器上。在我的例子中,我创建了一个文件。然后在上传后将其删除。似乎没有必要。 – NullVoxPopuli

+1

不是文件只是硬盘上的字节集合吗?在不接触硬盘的情况下写字节只是将数据保存在内存中,就像你的'bytes'变量。编辑:似乎你想使用'文件'模块的一些功能,而没有一个实际的文件,对吧? –

回答

4

你为什么不上传字节到服务器?

您可能不得不比正常水平稍低一些,但请检查UploadIO类别的multipart-post宝石。

+0

重写,从我看到UploadIO/multipart-post就像request = Net :: HTTP :: Post :: Multipart.new(“/ path /”, {“file”=> UploadIO.new(string_io,“text/plain“,file.path), ”merge“=> false, ”ignore_missing“=> false, ”label“=>”“, ”low_priority“=> false}) 所以我需要一个传递给UploadIO的文件 – Matilda

+0

'UploadIO'构造函数的参数是:1.带有你的数据的'IO',2.一个ContentType,3.一个字符串,通知文件的原始路径(因为协议期望一个文件名在某处)。只要你的数据与数据在'IO'中,你就可以伪造其余的数据。 – rewritten

0

我意识到我必须写入文件,删除文件,因为UploadIO发生在一个打开的文件 所以我创建了一个新的文件,写的内容,它在传递它作为一个File.open来UploadIO,然后我发送后删除了该文件。

相关问题