我正在为Chrome设计一个NaCl插件,并试图将本地的URL资源文件下载到Chrome的临时缓存中,但没有成功。
以下是我的工作方式:
// I indicate that I want the resource to be downloaded to a file
m_URLRequestInfo.SetStreamToFile( true );
// I open the request:
m_URLLoader.Open( m_URLRequestInfo, m_CCFactory.NewCallback( &MyClass::OnOpen ) );
...
// My callback (OnOpen) is eventually called.
// I then check to make sure the status code is 200 using this call:
m_URLLoader.GetResponseInfo().GetStatusCode()
// Then I ask to download the whole file:
m_URLLoader.FinishStreamingToFile( m_CCFactory.NewOptionalCallback( &MyClass::OnFileDownloaded ) );
...
// My other callback (OnFileDownloaded) gets eventually called,
// and again the status code is 200.
// Then I query the FileRef using this call:
pp::FileRef l_FileRef = m_URLLoader.GetResponseInfo().GetBodyAsFileRef();
返回的pp :: FileRef似乎没问题,但pp :: FileRef :: GetFileSystemType()返回PP_FILESYSTEMTYPE_EXTERNAL,然后对pp :: FileRef :: GetPath()的调用失败(它返回UNDEFINED pp :: VAR)。
所以从这一刻起,我迷失了。我不知道还应该做些什么才能获得指向浏览器缓存中本地文件的有效pp :: FileRef。我的最终目标是使用标准系统文件IO(如fopen())打开此本地文件(在我的情况下是一个图像文件)。
感谢任何光明!
答案 0 :(得分:0)
您是否有理由不能使用nacl_io
库?有了它,你可以这样写:
#include <stdio.h>
#include <sys/mount.h>
// Mount an HTTP filesystem that reads files from "http://example.com/path/...".
mount("http://example.com/path/", "/mnt/http", "httpfs", 0, "");
// Performs a URL Request of "http://example.com/path/my_image.png".
FILE* file = fopen("/mnt/http/my_image.png", "r");
...
看看SDK中的nacl_io演示。它位于$NACL_SDK_ROOT/examples/demo/nacl_io
。
答案 1 :(得分:0)
在仔细阅读文档并运行更多测试之后,我终于弄清楚我做错了什么。
当我们调用pp :: URLLoader :: FinishStreamingToFile时,文件将被下载到浏览器的缓存中,但无法使用常规的stdio服务(如fopen,fread等)打开/读取。我们需要使用pp :: FileIO类服务打开获取的pp :: FileRef并读取文件的内容。
所以这就是我成功加载和读取浏览器为我下载的文件所做的工作。基本上,我继续使用C ++ PPAPI服务。
(1)在从m_URLLoader-&gt; FinishStreamingToFile回调后,我们再调用m_FileIO-&gt;打开以使用获取的FileRef打开下载的文件;
(2)从m_FileIO回调 - >打开后,我们再调用m_FileIO-&gt; Query来获取下载文件的大小(以及其他一些文件属性);
(3)在从pp :: FileIO :: Query回调时,我们检查文件属性类型(例如不是文件夹),分配足够大的内存缓冲区来保存整个文件内容,并开始调用pp: :FileIO :: Read以获取文件的内容;
(4)从pp :: FileIO :: Read回调时,如果获得的nResult参数为0,那么我们就达到了EOF,我们完成了将文件内容读入内存缓冲区;如果获得的nResult> 0,然后它表示成功读取的字节数,我们再次调用m_FileIO-&gt; Read继续读取字节,并将它们存储在我们的内存缓冲区中的不同偏移位置;如果获得的nResult&lt; 0然后发生错误,我们必须终止阅读过程。
许多步骤和许多回调需要管理,但最终这种方法很顺利。