发送到php上传图片文件的Android图片文件是application / octet-stream类型而不是image / jpeg?

时间:2012-01-08 14:00:53

标签: php android

大家好,希望有人可以提供帮助 - 要完成我的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

4 个答案:

答案 0 :(得分:4)

application/octet-streamimage/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。