gpt4 book ai didi

ios - 通过 POST 和 NSURLSession 上传图片 NSData

转载 作者:可可西里 更新时间:2023-11-01 03:06:54 26 4
gpt4 key购买 nike

我正在尝试将单个 UIImage 上传到服务器,但似乎一切正常,只是图像从未上传过。

这是我用来在 iOS 中上传图片的代码:

const NSString *boundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
const NSString *fileParamConstant = @"photo";

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundaryConstant];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

NSMutableData *body = [NSMutableData data];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:info[UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
ALAssetRepresentation *representation = [asset defaultRepresentation];

// get byte size of image
long long size = [representation size];
unsigned char *bytes = malloc(size);

// read image data into bytes array
[representation getBytes:bytes fromOffset:0 length:size error:nil];

NSData *imageData = [NSData dataWithBytesNoCopy:bytes length:size freeWhenDone:YES];

if (imageData) {
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fileParamConstant, filename] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",[SWNetworkController contentTypeForImageData:imageData]] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

NSString *postLength = [NSString stringWithFormat:@"%zu", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:body];

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"STRING %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"%@", response);
NSLog(@"%@", error);
}];
[uploadTask resume];
} failureBlock:^(NSError *error) {
NSLog(@"Image error:\n%@",error);
}];

服务器以 200 OK 状态响应并且没有错误,除了没有收到图像并且服务器没有返回任何内容(如果没有上传图像,这是预期的)。

服务器端代码如下:

<?
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["photo"]["name"]);
$extension = end($temp);

error_log(print_r($_FILES, true));

if ((($_FILES["photo"]["type"] == "image/gif")
|| ($_FILES["photo"]["type"] == "image/jpeg")
|| ($_FILES["photo"]["type"] == "image/jpg")
|| ($_FILES["photo"]["type"] == "image/pjpeg")
|| ($_FILES["photo"]["type"] == "image/x-png")
|| ($_FILES["photo"]["type"] == "image/png"))
&& ($_FILES["photo"]["size"] < 20000000)
&& in_array($extension, $allowedExts)) {
if ($_FILES["photo"]["error"] == 0) {
$filename = sha1($_FILES['photo']['name'] . uniqid("",true));
if (move_uploaded_file($_FILES['photo']['tmp_name'], 'pic/' . $filename . "." . $extension)) {
// do stuff with the saved image here
}
}
}
?>

正常请求(通过网络界面)记录以下内容:

Array
(
[photo] => Array
(
[name] => BoPzSyRIgAAe1h6.jpg-large.jpeg
[type] => image/jpeg
[tmp_name] => /var/tmp/phpjScXQB
[error] => 0
[size] => 67900
)

)

同时,从 iOS 发送的请求如下所示:

Array
(
)

对于我的生活,我无法弄清楚出了什么问题......有什么想法吗?

谢谢

最佳答案

问题出在 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:...]

NSURLSessionUploadTask 忽略提供的请求主体并添加 fromData: 参数作为请求主体。但是,我只是提供图像数据,而不是格式正确的请求正文...

然后固定代码是 NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:body completionHandler:...]

我会留下我的答案,以防其他人再次遇到这个问题。

关于ios - 通过 POST 和 NSURLSession 上传图片 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23879576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com