使用 iOS 和变体更新 Blob 数据


Updating Blob data using iOS and variation

我正在做一个项目,我必须将图像文件作为BLOB数据从iOS应用程序和Android应用程序上传到MySQL数据库。我使用了以下代码

对于 iOS:

imageData = UIImageJPEGRepresentation(croppedImage, 0.9);

以下代码正在插入图像数据:

NSString *encodedString = [[imageData base64Encoding] urlEncodeUsingEncoding:NSUTF8StringEncoding];

NSString  *insertURL = [NSString stringWithFormat:[[@"http://" stringByAppendingString:IP]stringByAppendingString: @":8888/MasterTableInsert.php?id=%@&pf=%@&coord=%@&ct=%@"],[processID urlEncodeUsingEncoding:NSUTF8StringEncoding],encodedString ,[locationCoor urlEncodeUsingEncoding:NSUTF8StringEncoding],[currentTimeInString urlEncodeUsingEncoding:NSUTF8StringEncoding]];

php 脚本与此处所示相同

对于安卓

                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG,90, stream);
                byte[] byte_arr = stream.toByteArray();
                String image_str = new String(Base64.encode(byte_arr,Base64.DEFAULT));
                System.out.println(camTime + "picture taken time");
                System.out.println(image_str + "image encoded string");
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("id",encodedPid));
                 
                nameValuePairs.add(new BasicNameValuePair("coord",loc));
                 
                nameValuePairs.add(new BasicNameValuePair("ct",camTime));
                nameValuePairs.add(new BasicNameValuePair("pf", image_str));
                
                
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(constants.URL + "MasterTableInsertJava.php" );
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF_8"));

                HttpResponse response = httpClient.execute(httpPost);

和PHP代码一样,如图所示

我看到的问题是,对于 iOS,任何超过 5kib 的 BLOB 内容都不会插入到表中,但是对于 android,即使 BLOB 内容大小约为 20kib 或更高,它也能正常工作。知道为什么会这样吗?我做错了什么吗?

这两种情况之间的区别在于,您将图像作为GET参数从iOS发送,而在Android的情况下则作为POST发送。因此,最可能的原因是服务器上设置的 URI 长度限制。您有两种可能的解决方案:

  1. 将 iOS 代码更改为使用 POST(推荐),如此问题的解答或文档中所述。

  2. 增加服务器上的 URI 长度限制。如果您使用的是 Apache,则需要更改或添加 LimitRequestLine 指令。Apache 的默认值为 8190 字节,这与编码前观察到的 5 kb 限制一致。另请参阅此问题。