项目作者: maximbilan

项目描述 :
Quickblox: Uploading from a file, downloading to a file
高级语言: Objective-C
项目地址: git://github.com/maximbilan/iOS-QuickBlox-File-Uploader-Downloader.git
创建时间: 2015-04-13T17:48:41Z
项目社区:https://github.com/maximbilan/iOS-QuickBlox-File-Uploader-Downloader

开源协议:MIT License

下载


Quickblox: Uploading from a file, downloading to a file

Unfortunately QuickBlox iOS SDK has methods for downloading and uploading only using memory. We need pass the NSData or receive NSData. It’s really problem. You can see methods from QuickBlox iOS SDK in the end of the article or here. In this sample I provide example, how to upload content from file, and how to download to file following the API.

Uploading

First of all we should create QB File. Curl request:

  1. curl -X POST \
  2. -H "Content-Type: application/json" \
  3. -H "QuickBlox-REST-API-Version: 0.1.0" \
  4. -H "QB-Token: 20e55d804b6bff1cba87cb0215d8967150722ecb" \
  5. -d '{"blob": {"content_type": "image/jpeg", "name": "museum.jpeg"}}' \
  6. http://api.quickblox.com/blobs.json

Response:

  1. {
  2. "blob": {
  3. "blob_status": null,
  4. "content_type": "image/jpeg",
  5. "created_at": "2012-04-23T13:22:34Z",
  6. "id": 315,
  7. "last_read_access_ts": null,
  8. "lifetime": 0,
  9. "name": "111.jpg",
  10. "public": false,
  11. "ref_count": 1,
  12. "set_completed_at": null,
  13. "size": null,
  14. "uid": "30a8bcd7c714417eb62b95350d7e13b900",
  15. "updated_at": "2012-04-23T13:22:34Z",
  16. "blob_object_access": {
  17. "blob_id": 315,
  18. "expires": "2012-04-23T14:22:34Z",
  19. "id": 315,
  20. "object_access_type": "Write",
  21. "params": "https://qbprod.s3.amazonaws.com/?Content-Type=image%2Fpng&Expires=Wed%2C%2030%20Sep%202015%2013%3A25%3A11%20GMT&acl=authenticated-read&key=fbc2d08125e3435ca5cb37f926d5fe8800&policy=eyJleHBpcmF0aW9uIjoiMjAxNS0wOS0zMFQxMzoyNToxMVoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJxYnByb2QifSx7ImFjbCI6ImF1dGhlbnRpY2F0ZWQtcmVhZCJ9LHsiQ29udGVudC1UeXBlIjoiaW1hZ2UvcG5nIn0seyJzdWNjZXNzX2FjdGlvbl9zdGF0dXMiOiIyMDEifSx7IkV4cGlyZXMiOiJXZWQsIDMwIFNlcCAyMDE1IDEzOjI1OjExIEdNVCJ9LHsia2V5IjoiZmJjMmQwODEyNWUzNDM1Y2E1Y2IzN2Y5MjZkNWZlODgwMCJ9LHsieC1hbXotY3JlZGVudGlhbCI6IkFLSUFJWTdLRk0yM1hHWEo3UjdBLzIwMTUwOTMwL3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSx7IngtYW16LWFsZ29yaXRobSI6IkFXUzQtSE1BQy1TSEEyNTYifSx7IngtYW16LWRhdGUiOiIyMDE1MDkzMFQxMjI1MTFaIn1dfQ%3D%3D&success_action_status=201&x-amz-algorithm=AWS4-HMAC-SHA256&x-amz-credential=AKIAIY7KFM23XGXJ7R7A%2F20150930%2Fus-east-1%2Fs3%2Faws4_request&x-amz-date=20150930T122511Z&x-amz-signature=a5c720c1a3b9b5c0b2549e0220419493ca3b11ce84618f6ece88ad97a96a8ad9"
  22. }
  23. }
  24. }

Objective C implementation:

  1. QBCBlob *b = [QBCBlob blob];
  2. b.name = filename;
  3. b.contentType = @"image/jpeg";
  4. [QBRequest createBlob:b successBlock:^(QBResponse *response, QBCBlob *blob) {
  5.  
  6. } errorBlock:^(QBResponse *response) {
  7.  
  8. }];

Now we have an amazon link, and we can upload the file. We need to do the following request:

  1. curl -X POST
  2. -F "Content-Type=image/jpeg"
  3. -F "Expires=Wed, 30 Sep 2015 13:29:39 GMT"
  4. -F "acl=authenticated-read"
  5. -F "key=76101edd87fe4b299ff41f63633bf9c100"
  6. -F "policy=eyJleHBpcmF0aW9uIjoiMjAxNS0wOS0zMFQxMzoyOTozOVoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJxYnByb2QifSx7ImFjbCI6ImF1dGhlbnRpY2F0ZWQtcmVhZCJ9LHsiQ29udGVudC1UeXBlIjoiaW1hZ2UvanBnIn0seyJzdWNjZXNzX2FjdGlvbl9zdGF0dXMiOiIyMDEifSx7IkV4cGlyZXMiOiJXZWQsIDMwIFNlcCAyMDE1IDEzOjI5OjM5IEdNVCJ9LHsia2V5IjoiNzYxMDFlZGQ4N2ZlNGIyOTlmZjQxZjYzNjMzYmY5YzEwMCJ9LHsieC1hbXotY3JlZGVudGlhbCI6IkFLSUFJWTdLRk0yM1hHWEo3UjdBLzIwMTUwOTMwL3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSx7IngtYW16LWFsZ29yaXRobSI6IkFXUzQtSE1BQy1TSEEyNTYifSx7IngtYW16LWRhdGUiOiIyMDE1MDkzMFQxMjI5MzlaIn1dfQ=="
  7. -F "success_action_status=201"
  8. -F "x-amz-algorithm=AWS4-HMAC-SHA256"
  9. -F "x-amz-credential=AKIAIY7KFM23XGXJ7R7A/20150930/us-east-1/s3/aws4_request"
  10. -F "x-amz-date=20150930T122939Z"
  11. -F "x-amz-signature=eee18ae3d47a745bccc9007d1b7b1679e855becb44b1928bb710428e18e397a8"
  12. -F "file=@user_new_avatar.jpg"
  13. https://qbprod.s3.amazonaws.com/

Curl response:

  1. https://blobs-test-oz.s3.amazonaws.com/d5f92bcf84374e4fb8961537f7a7de6500
  2. blobs-test-oz
  3. d5f92bcf84374e4fb8961537f7a7de6500
  4. "de1aae3e6beadb83bc8e1e21eb7e2a66"
  5.  

In Objective C it’s more difficult. We need to do Form Data request. The easiest way to do this, use ASIHTTPRequest framework. For example:

  1. NSDictionary *params = blob.blobObjectAccess.params;
  2. ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:blob.blobObjectAccess.url];
  3. [request setPostValue:params[@"Content-Type"] forKey:@"Content-Type"];
  4. [request setPostValue:params[@"Expires"] forKey:@"Expires"];
  5. [request setPostValue:params[@"acl"] forKey:@"acl"];
  6. [request setPostValue:params[@"key"] forKey:@"key"];
  7. [request setPostValue:params[@"policy"] forKey:@"policy"];
  8. [request setPostValue:params[@"success_action_status"] forKey:@"success_action_status"];
  9. [request setPostValue:params[@"x-amz-algorithm"] forKey:@"x-amz-algorithm"];
  10. [request setPostValue:params[@"x-amz-credential"] forKey:@"x-amz-credential"];
  11. [request setPostValue:params[@"x-amz-date"] forKey:@"x-amz-date"];
  12. [request setPostValue:params[@"x-amz-signature"] forKey:@"x-amz-signature"];
  13. [request setFile:url forKey:@"file"];
  14.  
  15. [request setCompletionBlock^{
  16. }];
  17.  
  18. [request setFailedBlock:^{
  19. }];
  20.  
  21. [request startAsynchronous];

And after that we should set the file status to ‘Complete’. If the specified file size does not match to the actual, the actual will be set.

Curl request:

  1. curl -X PUT \
  2. -H "Content-Type: application/json" \
  3. -H "QuickBlox-REST-API-Version: 0.1.0" \
  4. -H "QB-Token: 74b0087b00d748f944429f1c355b91169f5d9d52" \
  5. -d '{"blob": {"size": "86"}}' \
  6. http://api.quickblox.com/blobs/97/complete.json

Objective C:

  1. NSError *attributesError;
  2. NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:url error:&attributesError];
  3. NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
  4. NSUInteger fileSize = [fileSizeNumber unsignedIntegerValue];
  5.  
  6. [QBRequest completeBlobWithID:blob.ID size:fileSize successBlock:^(QBResponse *response) {
  7.  
  8. } errorBlock:^(QBResponse *response) {
  9.  
  10. }];

That’s all about uploading.

Downloading

It’s easiest than uploading. One request for receiving url.

Curl request:

  1. curl -X POST \
  2. -H "Content-Type: application/json" \
  3. -H "QuickBlox-REST-API-Version: 0.1.0" \
  4. -H "QB-Token: 74b0087b00d748f944429f1c355b91169f5d9d52" \
  5. http://api.quickblox.com/blobs/301/getblobobjectbyid.json

Response:

  1. {
  2. "blob_object_access": {
  3. "id": 97,
  4. "blob_id": 97,
  5. "expires": "2012-03-22T17:35:43Z",
  6. "object_access_type": "Read",
  7. "params": "https://blobs-test-oz.s3.amazonaws.com:443/49d386c6cc68437a9fcae66ce7edfa8b00?Signature=ZRKS05Fvlu5n8Cx2yTh7JQAZr7k%3D&Expires=1332437743&AWSAccessKeyId=AKIAJHMRS6ZUIQ6VTQDQ"
  8. }
  9. }

Objective C:

  1. [QBRequest blobObjectAccessWithBlobID:fileId successBlock:^(QBResponse *response, QBCBlobObjectAccess objectAccess) {
  2.  
  3. } errorBlock:^(QBResponse *response) {
  4.  
  5. }];

For a simple way to download a file using MBFileDownloader:

  1. MBFileDownloader *fileDownloader = [[MBFileDownloader alloc] initWithURL:[NSURL URLWithString:objectAccess.urlWithParams] toFilePath:filePath];
  2.  
  3. [fileDownloader downloadWithSuccess:^{
  4.  
  5. } update:^(float value) {
  6.  
  7. } failure:^(NSError *error) {
  8.  
  9. }];

That’s all.

I provide a sample in this repository, the full process of uploading and downloading. Please use for free.

Methods from QuickBlox iOS SDK

  1. #pragma mark -
  2. #pragma mark Upload file using BlobObjectAccess
  3.  
  4. /**
  5. Upload file using BlobObjectAccess
  6.  
  7. @param data File
  8. @param blobWithWriteAccess An instance of QBCBlobObjectAccess
  9. @param successBlock Block with response if request succeded
  10. @param statusBlock Block with upload/download progress
  11. @param errorBlock Block with response instance if request failed
  12. @return An instance of QBRequest. Use this instance to cancel the operation.
  13. */
  14. + (QBRequest *)uploadFile:(NSData *)data
  15. blobWithWriteAccess:(QBCBlob *)blobWithWriteAccess
  16. successBlock:(void(^)(QBResponse *response))successBlock
  17. statusBlock:(QBRequestStatusUpdateBlock)statusBlock
  18. errorBlock:(void(^)(QBResponse *response))errorBlock;
  19.  
  20. #pragma mark -
  21. #pragma mark Download file
  22.  
  23. /**
  24. Download file
  25.  
  26. @param UID File unique identifier, value of UID property of the QBCBlob instance.
  27. @param successBlock Block with response if request succeded
  28. @param statusBlock Block with upload/download progress
  29. @param errorBlock Block with response instance if request failed
  30. @return An instance of QBRequest. Use this instance to cancel the operation.
  31. */
  32. + (QBRequest *)downloadFileWithUID:(NSString *)UID
  33. successBlock:(void(^)(QBResponse *response, NSData *fileData))successBlock
  34. statusBlock:(QBRequestStatusUpdateBlock)statusBlock
  35. errorBlock:(void(^)(QBResponse *response))errorBlock;
  36.  
  37. #pragma mark -
  38. #pragma mark Tasks
  39.  
  40. /**
  41. Upload File task. Contains 3 requests: Create Blob, upload file, declaring file uploaded
  42.  
  43. @param data file to be uploaded
  44. @param fileName name of the file
  45. @param contentType type of the content in mime format
  46. @param isPublic blob's visibility
  47. @param successBlock Block with response if request succeded
  48. @param statusBlock Block with upload/download progress
  49. @param errorBlock Block with response instance if request failed
  50. @return An instance of QBRequest. Use this instance to cancel the operation.
  51. */
  52. + (QBRequest *)TUploadFile:(NSData*)data
  53. fileName:(NSString*)fileName
  54. contentType:(NSString*)contentType
  55. isPublic:(BOOL)isPublic
  56. successBlock:(void(^)(QBResponse *response, QBCBlob* blob))successBlock
  57. statusBlock:(QBRequestStatusUpdateBlock)statusBlock
  58. errorBlock:(void(^)(QBResponse *response))errorBlock;
  59.  
  60. /**
  61. Download File task. Contains 2 requests: Get Blob with ID, download file
  62.  
  63. @param blobID Unique blob identifier, value of ID property of the QBCBlob instance.
  64. @param successBlock Block with response and fileData if request succeded
  65. @param statusBlock Block with upload/download progress
  66. @param errorBlock Block with response instance if request failed
  67. @return An instance of QBRequest. Use this instance to cancel the operation.
  68. */
  69.  
  70. + (QBRequest *)TDownloadFileWithBlobID:(NSUInteger)blobID
  71. successBlock:(void(^)(QBResponse *response, NSData *fileData))successBlock
  72. statusBlock:(QBRequestStatusUpdateBlock)statusBlock
  73. errorBlock:(void(^)(QBResponse *response))errorBlock;