大家好,希望有人可以提供帮助 - 要完成我的Android应用程序,我只需要完成课程,用户可以将图像上传到服务器(MySql)。
除了图像的格式是application / octet-stream而不是从我的Android应用程序发送的image / jpeg之外,一切正常吗? 无论如何我可以打开文件application / octet-stream并将其更改为image / jpeg类型??
用于上传的php文件...
$fileName = $_FILES['uploaded']['name'];
$tmpName = $_FILES['uploaded']['tmp_name'];
$fileSize = $_FILES['uploaded']['size'];
$fileType = $_FILES['uploaded']['type'];
$fp = fopen($tmpName, 'rb');
$content = fread($fp, $fileSize);
$content = addslashes($content);
使用表单上传表单没问题。但是当从具有错误图像类型的android应用程序使用时,它将blob文件保存为空0,$ fileSize显示真实大小,但是当创建$ content时它根本不显示任何内容
177 rome 2.jpg image / jpeg 6876 [BLOB - 6.7 KiB] p(这是来自网页) 215 myImage.jpg application / octet-stream 1066 [BLOB - 0 B](来自手机)
Thx guys
答案 0 :(得分:4)
application/octet-stream
或image/jpeg
只是HTTP客户端(浏览器)添加的mime类型,作为二进制文件数据本身旁边的附加信息。
所以mime-type在这里不应该有任何问题。只是您看到程序失败的请求之间存在差异,但这不一定是导致问题的原因。
所以你基本上看错了地方。
相反,您应该在代码中添加错误和条件检查。特别是前提条件检查,以便您知道您的脚本可以正确操作它提供的数据。
根据你在问题中看到的内容,我没有更具体的内容。希望这无论如何都有用。
PHP手册还有a section about file-uploads,其中包含一些有用的信息。处理错误案例。
除此之外,您的代码可能只是在将数据插入数据库方面存在问题,因此问题可能与技术上的文件上传完全无关。
答案 1 :(得分:4)
有些机器人确实使用mime-type application/octet-stream
上传而不是正确的。
为此,我做了以下事情:
//the uploaded file
$img = $_FILES['img'];
//array for type if octet
$realMime = array(
'useNew' => false,
'type' => ''
);
if($img['type'] == "application/octet-stream"){
$imageMime = getimagesize($img['tmp_name']); // get temporary file REAL info
$realMime['type'] = $imageMime['mime']; //set in our array the correct mime
$realMime['useNew'] = true; //set to true for next if
}
//now check if we will use the realMime or the one sent by browser
//$mimeCheck is the things you want to check. In my case i just wanted PNG or JPG
if($realMime['useNew'] == true){ //if true, use realMime to check
$mimeCheck = ($realMime['type'] != "image/png" && $realMime['type'] != "image/jpeg" && $realMime['type'] != "image/jpg");
}else{ //if not using real mime, go with the one browser sent us
$mimeCheck = ($img['type'] != "image/png" && $img['type'] != "image/jpeg" && $img['type'] != "image/jpg");
}
//returns error if image not png/jpg/jpeg
if($mimeCheck){
//return some error
}
有了这个,你可以检查。当然必须为getimagesize()
制作一个错误处理程序,因为用户可以上传一个实际上不是图像的八位字节流文件。
有关详情,请参阅PHP.net getimagesize() doc
答案 2 :(得分:1)
在Android端进行正确的通话,我们应该像这样进行网络服务调用:
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("https://someserver.com/api/path/");
postRequest.addHeader("Authorization",authHeader);
//don't set the content type here
//postRequest.addHeader("Content-Type","multipart/form-data");
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
reqEntity.addPart("parm-name", new InputStreamBody(fileInputStream,"image/jpeg","file_name.jpg"));
postRequest.setEntity(reqEntity);
HttpResponse response = httpclient.execute(postRequest);
}catch(Exception e) {
Log.e("URISyntaxException", e.toString());
}
答案 3 :(得分:0)
我知道它有点晚了,但我认为这个答案也可以帮助其他人。
我在http://php.net/manual/en/features.file-upload.php
上找到了这个// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (false === $ext = array_search(
$finfo->file($_FILES['upfile']['tmp_name']),
array(
'jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
),
true
)) {
throw new RuntimeException('Invalid file format.');
}
因此,如果你想检查mime类型,你应该finfo
而不是$_FILE[type]
给出的mime类型。这可能是错的,所以你可以自己猜一下mime类型。特别是当设备不同时,例如android。