我正在尝试使用Parse作为我的应用程序的可能后端,但在处理我想上传到它的大文件时我有一个问题。
文档中的表示我需要将文件转换为byte array
并将其传递到ParseFile
,如此
byte[] data = "Working at Parse is great!".getBytes();
ParseFile file = new ParseFile("resume.txt", data);
但是大文件显然可以抛出OutOfMemoryException
,因为将文件加载到字节数组会将整个文件加载到内存中。
所以我的问题是如何在避免获取OOME的同时将大文件上传到Parse?
答案 0 :(得分:1)
如果用户完全控制上传过程,您的用户很可能最终会崩溃该应用,因为许多用户对文件大小不太了解。我注意到该解析有a nice wrapper class in their API for iOS (PFFile),限制为10 MB,很可惜他们没有为Android实现相同的功能。
我认为您将不得不使用他们的REST API手动执行此操作。看看他们的REST API,更具体地说是files endpoint。您可以轻松地将HttpURLConnection
与FileInputStream
结合使用,这使您可以更灵活地使用流上传过程。我通常更乐于手动操作,而不是使用不完全清楚幕后发生的事情的包装,但如果你不是,我可以发布一个简约的例子。
答案 1 :(得分:0)
一种可能的解决方案是读取大文件的部分内容并分别上传每个部分。您需要这样做,以便在重新下载文件时重新组合文件。
答案 2 :(得分:0)
没有理由不能使用REST API并使用普通的http 1.1标头对上传进行分块。
你应该读一下'chunked-encoding'并弄清楚如何将你的整个字节数据分割成android,如果真的那么大的话。
在android中,在发件人中,你必须对内容进行分段,明确管理两边都有流的io ...
输出流,您应该能够直接连接到http请求对象“OUT STREAM”。输入端只是读取输入文件的较小块,因此可以节省内存。
您设置了http连接
连接
获取http-connection-request的OUTSTREAM并将其传递给处理您的分块的streamCopy工具。
HTTP req标头:
> Transfer-Encoding: chunked
> Expect: 100-continue
来自解析的HTTP响应头应该看到......
表示“100继续”的东西,它等待连接到请求的输出流后面的分块过程发送更多数据。
使用http POST时,请记住关闭流/连接。
注意 - 如果你有大文件,你真的应该质疑你从大尺寸中得到的东西。所有类型的媒体文件都允许您在上传之前调整大小。