Skip to content

Commit a67ac0e

Browse files
committed
Allow uploading a native file (e.g. photo) via XMLHttpRequest
1 parent a1193b7 commit a67ac0e

File tree

5 files changed

+55
-10
lines changed

5 files changed

+55
-10
lines changed

Libraries/Image/RCTImageLoader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@
2323
+ (void)loadImageWithTag:(NSString *)tag
2424
callback:(void (^)(NSError *error, id /* UIImage or CAAnimation */ image))callback;
2525

26+
+ (BOOL)isSystemImageURI:(NSString *)uri;
27+
2628
@end

Libraries/Image/RCTImageLoader.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,11 @@ + (void)loadImageWithTag:(NSString *)imageTag callback:(void (^)(NSError *error,
156156
}
157157
}
158158

159+
+ (BOOL)isSystemImageURI:(NSString *)uri
160+
{
161+
return uri != nil && (
162+
[uri hasPrefix:@"assets-library"] ||
163+
[uri hasPrefix:@"ph://"]);
164+
}
165+
159166
@end

Libraries/Network/RCTDataManager.m

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import "RCTConvert.h"
1414
#import "RCTLog.h"
1515
#import "RCTUtils.h"
16+
#import "RCTImageLoader.h"
1617

1718
@implementation RCTDataManager
1819

@@ -34,8 +35,43 @@ @implementation RCTDataManager
3435
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
3536
request.HTTPMethod = [RCTConvert NSString:query[@"method"]] ?: @"GET";
3637
request.allHTTPHeaderFields = [RCTConvert NSDictionary:query[@"headers"]];
37-
request.HTTPBody = [RCTConvert NSData:query[@"data"]];
3838

39+
if (query[@"data"] != [NSNull null]) {
40+
NSDictionary *data = [RCTConvert NSDictionary:query[@"data"]];
41+
NSData *body = [RCTConvert NSData:data[@"string"]];
42+
if (body != nil) {
43+
request.HTTPBody = body;
44+
[RCTDataManager sendRequest:request responseSender:responseSender];
45+
return;
46+
}
47+
NSString *uri = [RCTConvert NSString:data[@"uri"]];
48+
if (uri != nil) {
49+
if ([RCTImageLoader isSystemImageURI:uri]) {
50+
[RCTImageLoader loadImageWithTag:(NSString *)uri callback:^(NSError *error, UIImage *image) {
51+
if (error) {
52+
RCTLogError(@"Error loading image URI: %@", error);
53+
// We should really circle back to JS here and notify an error/abort on the request.
54+
return;
55+
}
56+
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
57+
request.HTTPBody = imageData;
58+
[RCTDataManager sendRequest:request responseSender:responseSender];
59+
}];
60+
} else {
61+
RCTLogError(@"Cannot resolve URI: %@", uri);
62+
}
63+
return;
64+
}
65+
}
66+
67+
// There was no data payload, or we couldn't understand it.
68+
[RCTDataManager sendRequest:request responseSender:responseSender];
69+
} else {
70+
RCTLogError(@"unsupported query type %@", queryType);
71+
}
72+
}
73+
74+
+ (void)sendRequest:(NSURLRequest *)request responseSender:(RCTResponseSenderBlock)responseSender {
3975
// Build data task
4076
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *connectionError) {
4177

@@ -71,11 +107,6 @@ @implementation RCTDataManager
71107
}];
72108

73109
[task resume];
74-
75-
} else {
76-
77-
RCTLogError(@"unsupported query type %@", queryType);
78-
}
79110
}
80111

81112
@end

Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@
209209
"$(inherited)",
210210
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
211211
"$(SRCROOT)/../../React/**",
212+
"$(SRCROOT)/../Image/**",
212213
);
213214
LIBRARY_SEARCH_PATHS = "$(inherited)";
214215
OTHER_LDFLAGS = "-ObjC";
@@ -226,6 +227,7 @@
226227
"$(inherited)",
227228
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
228229
"$(SRCROOT)/../../React/**",
230+
"$(SRCROOT)/../Image/**",
229231
);
230232
LIBRARY_SEARCH_PATHS = "$(inherited)";
231233
OTHER_LDFLAGS = "-ObjC";

Libraries/Network/XMLHttpRequest.ios.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@ var XMLHttpRequestBase = require('XMLHttpRequestBase');
2020
class XMLHttpRequest extends XMLHttpRequestBase {
2121

2222
sendImpl(method: ?string, url: ?string, headers: Object, data: any): void {
23+
if (typeof data === 'string') {
24+
data = {string: data};
25+
}
2326
RCTDataManager.queryData(
2427
'http',
2528
{
26-
method: method,
27-
url: url,
28-
data: data,
29-
headers: headers,
29+
method,
30+
url,
31+
data,
32+
headers,
3033
},
3134
// TODO: Do we need this? is it used anywhere?
3235
'h' + crc32(method + '|' + url + '|' + data),

0 commit comments

Comments
 (0)