我正在使用解析来聊聊我的应用程序。当我上传文件时,我会保留网址,并将网址发送给其他用户,然后用户可以通过此网址下载文件。
以下是我上传文件的代码:
+ (void)uploadBlob:(NSData *)blob fileName:(NSString *)fileName type:(NSString *)type {
if ([self private_checkCloudForbidden]) {
return;
}
if (CHOSEN_SERVER_DATABASE == ServersQuickBlox) {
if ([Format isThumbnailWithBlobFileName:fileName]) {
type = @"image";
}
NSString *qbContentType = @"";
if ([type isEqualToString:@"image"]) {
qbContentType = @"image/jpg";
}
[QBContent TUploadFile:blob fileName:fileName contentType:qbContentType isPublic:YES delegate:[CloudDelegate sharedInstance]];
}
else if (CHOSEN_SERVER_DATABASE == ServersParse) {
PFFile *file = [PFFile fileWithName:fileName data:blob];
[file saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (error){
NSLog(@"Error: %@", [[error userInfo] objectForKey:@"error"]);
} else {
[CloudHandler didUploadBlobWithFileName:file.name blobID:file.url];
}
}];
}
}
在CloudHandler didUploadBlobWithFileName方法中,我将文件的url保存为blobID。 以下是使用QuickBlox时通过blobID / url下载文件的方法:
+ (void)downloadWithBlobId: (NSString *)blobID {
if ([self private_checkCloudForbidden]) {
return;
}
if (CHOSEN_SERVER_DATABASE == ServersQuickBlox) {
[QBContent TDownloadFileWithBlobID:blobID.integerValue delegate:[CloudDelegate sharedInstance]];
}
else if (CHOSEN_SERVER_DATABASE == ServersParse) {
//TODO: HOW TO DOWNLOAD FILES?
}
}
我没有找到通过URL下载文件的API。 (如果parse确实提供了无用的url或blobID,那就有点奇怪了
编辑:
我不使用'file'类型属性的原因:
1. I can't store 'file' on local database. It has to be the blobID or URL.
2. when I send a rich message, I can send along the blobID, so that the receiver does not have to fetch the object first before downloading the binary.
答案 0 :(得分:5)
您应该转移PFObject而不是网址。 像这样:
PFObject *object; //the object you have
PFFile *soundFile = object[@"file"];
[soundFile getDataInBackgroundWithBlock:^(NSData *soundData, NSError *error) {
if (!error) {
[self saveSoundFileToDocuments:soundData fileName:object[@"fileName"]];
}
}
progressBlock:^(int percentDone) {
}];
- (void)saveSoundFileToDocuments:(NSData *)soundData fileName:(NSString *)fileName {
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:[DataAcesss encryptText:fileName]]];
[soundData writeToFile:databasePath atomically:YES];
}
这样您就可以下载文件并拥有文件名。
答案 1 :(得分:0)
UIKit提供的用于从URL检索数据的API是异步的,以便使UI保持响应。它使用NSURLConnectionDelegate接口。您应该实现该接口,以便异步接收数据。 首先,您可以从URL初始化检索:
NSURLRequest *theRequest=[NSURLRequest requestWithURL:anUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:CONNECTION_TIMEOUT];
// create the connection with the request
// and start loading the data
urlConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (urlConnection) {
// Create the NSMutableData to hold the received data.
// receivedData is an instance variable declared elsewhere.
self.receivedData = [NSMutableData data];
} else {
// Inform the user that the connection failed.
NSLog(@"Failed to create connection to URL: %@.", anUrl);
}
此处包含此代码的类被设置为委托,因此应将此类声明为实现命名接口:
@interface MyClass : NSObject <NSURLConnectionDelegate> {
}
// URLConnection Delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse;
我当前的实现看起来像这样:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.
// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.
// receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// Do error handling here
NSLog(@"Connection failed! Error - %@ %@",
[error localizedDescription],
[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
// Now process the received data accumulated in receivedData.
}
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
return cachedResponse;
}
这应该让你去。
答案 2 :(得分:0)
PFFile对象不包含下载方法,因为它内置了iOS SDK的功能。或者您可以使用AFNetworking作为替代方案。我认为下载文件最简单的方法是使用NSData的同步构造函数和GCD:
dispatch_async(dispatch_get_global_queue(0), ^(){
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:file.url]];
dispath_async(dispatch_get_main_queue(), ^(){
// do you main UI thread stuff here
});
});