我有一个用HTTP Post方法上传的图像到我用PHP编写的网络服务器。 我的代码将位图压缩为jpeg编码的字节数组,并将该Base64编码发送到服务器进行解码,将其写入文件并将其作为jpg图像打开。
的index.php:
<?php
$base=$_REQUEST['image'];
echo $base;
// base64 encoded utf-8 string
$binary=base64_decode($base);
// binary, utf-8 bytes
header('Content-Type: bitmap; charset=utf-8');
// print($binary);
//$theFile = base64_decode($image_data);
$file = fopen('test.jpg', 'wb');
fwrite($file, $binary);
fclose($file);
echo '<img src=test.jpg>';
?>
我在同一目录中有一个空的0kb test.jpg。
有时我可以在快速按下F5(刷新)时看到图像,但是当我再次刷新时,图像会再次被删除,并且它再次被0KB。 (在Google Chrome上工作)
1)如何让图片继续显示写入test.jpg的数据并且不会变回0kb?因此,当我查看它时,图片仍然存在。 (请注意,我的PHP知识不太好,所以非常感谢指导。)
JAVA中的上传方法,Android:
public void uploadFrame(byte[] Frame, String WebClient) {
String ba1=Base64.encodeBytes(mCurrentFrame);
ArrayList<NameValuePair> nameValuePairs = new
ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("image",ba1));
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new
HttpPost(WebClient);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
}
2)另一个问题是,如果这种方法实际上是安全的,因为人们可以向它发送任何POST方法数据并显示任何图片。那么在PHP中如何首先检查JAVA中的参数是否等于PHP代码中的参数,因此只有具有相同参数的人才能将此代码上传到他的网络服务器。
对于某些人来说,这可能是一个非常有趣的主题。
编辑:
<?php
if (isset($_REQUEST['image'])) {
$base=$_REQUEST['image'];
echo $base;
// base64 encoded utf-8 string
$binary=base64_decode($base);
// binary, utf-8 bytes
header('Content-Type: bitmap; charset=utf-8');
// print($binary);
//$theFile = base64_decode($image_data);
$file = fopen('test.jpg', 'wb');
fwrite($file, $binary);
fclose($file);
echo '<img src=test.jpg>';
}
header('Content-type: image/jpeg');
readfile('test.jpg');
?>
答案 0 :(得分:1)
每次刷新页面时,都会将数据写入test.jpg
文件。如果你不提交base64图像,它只会写出一个空/空字符串,这意味着一个0字节的文件。
相反,试试这个:
<?php
if (isset($_REQUEST['image'])) {
... your decoding/fopen/fwrite stuff here ...
}
header('Content-type: image/jpeg')
readfile('test.jpg');
这将直接以jpg格式输出图像,而不是输出HTML并强制浏览器打开另一个HTTP连接来加载.jpg文件。
答案 1 :(得分:1)
回答问题2:
不,这不安全。你应该真的签名或者在传输过程中对它进行彻底加密,以确保你可以信任你得到的数据 - 它可能是你的,也可能是垃圾。有关详细信息,请查看mcrypt()
。
答案 2 :(得分:0)
快速警告:如果您将标题设置为我的位图,请不要将HTML写入屏幕:(echo '<img src=test.jpg>';
)
我会将标题回显为image/jpeg
,然后将原始二进制文件写入屏幕。