gpt4 book ai didi

iphone - Base64 编码图像在传输到服务器期间损坏

转载 作者:太空狗 更新时间:2023-10-30 03:48:01 25 4
gpt4 key购买 nike

由于某些原因,我无法使用 NSURLRequest 中的 post 方法将 jpeg 文件上传到服务器

我有一个使用相同 php 代码的 android 应用程序,可以通过将图像转换为字节数组然后使用 base64 编码发送和接收来很好地上传和下载图像。

我的 iPhone 应用程序可以很好地下载图像,php 脚本使用 base64 进行编码,我在我的 iPhone 应用程序中使用 base64 解码器,然后将其转换为图像。这很好用。

但是图片上传不成功。

我将图像转换为 base64 编码字符串(我对 base64 编码使用了几种不同的方法,它们都给出了相同的结果)然后我发布发送到服务器,在服务器端解码并保存到服务器上的文件。

服务器上生成的解码文件是损坏的 jpeg 图像。损坏的文件大小是应有字节数的 3 倍。

为上传生成的base64编码字符串也与从服务器下载相同的jpeg文件时生成的base64编码字符串有很大不同(即我使用ftp上传的有效图像文件服务)。

下面显示了我的代码以及用于接收图像的 php 脚本。

我相信转义字符会导致 base64 字符串在传输过程中损坏但无法解决。

为什么我的 base64 字符串在传输过程中被损坏?

NSString* comments = @"comments to go with image";


NSData *data = UIImageJPEGRepresentation(_imageView.image, 1);
NSString *base64EncodedImage = [NSString base64StringFromData: data length: data.length];



//load the team posts so we know what items have been posted and what haven't
NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
comments, @"comment",
base64EncodedImage , @"image",
nil];


NSMutableArray *parts = [[NSMutableArray alloc] init];
for (NSString *key in postDict) {
NSString *part = [NSString stringWithFormat: @"%@=%@", key, [postDict objectForKey:key]];
[parts addObject:part];
}

NSString *encodedDictionary = [parts componentsJoinedByString:@"&"];

NSData *postData = [encodedDictionary dataUsingEncoding:NSUTF8StringEncoding];

NSString* url = @"http://www.scroppohunt.com/upload.php";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {
_data = [[NSMutableData data] init];

}

以及接收图片的php脚本

<?php


$comments = $_REQUEST['comment'];


//do some database stuff with the comments

////////////////////////////////////////
//save the file to the images folder
///////////////////////////////////////////

$base=$_REQUEST['image'];

if(strlen($base) > 0)
{

// base64 encoded utf-8 string

$binary=base64_decode($base);

$file = fopen("postImages/test.jpg", 'wb');

fwrite($file, $binary);

fclose($file);
}

//display the bae64 encoded string taht was uploaded
echo $base;

?>

最佳答案

好吧,你问这个问题已经有一段时间了,但如果有人(像我一样)找到这个问题,这可能会有所帮助:

在您的 Base64 编码图像中,您应该将所有出现的“+”字符替换为“%”字符。翻译成代码,它将是:

NSString* encodedImageString = [base64EncodedImage stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];

然后,不要在 postDict 中添加 base64EncodedImage,而应添加 encodedImageString

这样,您的 postDict 将如下所示:

NSMutableDictionary *postDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
comments, @"comment",
encodedImageString , @"image",
nil];

我认为这将解决问题,至少对我来说是这样。

干杯。

关于iphone - Base64 编码图像在传输到服务器期间损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287116/

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