Привет всем, надеюсь, кто-то может помочь. Чтобы закончить мое приложение для Android, мне просто нужно закончить класс, так как пользователь может загрузить там изображение на сервер (MySql).
Все работает хорошо, за исключением того, что формат изображения – это приложение / октет-поток, а не изображение / jpeg, отправленное из моего приложения для Android. В любом случае я могу открыть файл-приложение / октет-поток и изменить его на тип 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] (с телефона)
Пол: Мужчина
application/octet-stream
или image/jpeg
– это только mime-тип, который HTTP-клиент (браузер) добавил в качестве дополнительной информации рядом с самими двоичными файловыми данными.
Таким образом, тип mime не должен быть проблемой. Просто вы видите разницу между запросами на случай отказа вашей программы, но это не должно быть причиной вашей проблемы.
Таким образом, вы в основном смотрите на неправильное место.
Вместо этого вы должны добавить проверку ошибок и условий в свой код. Особенно предварительные проверки, чтобы вы знали, что ваш скрипт может правильно работать с предоставленными им данными.
Из того, что вы сделали видимым в своем вопросе, я больше ничего не могу добавить. Надеюсь, это полезно в любом случае.
Также в руководстве PHP есть раздел о загрузке файлов, который содержит некоторую полезную информацию, в том числе. касающихся ошибок.
Кроме того, у вашего кода может возникнуть проблема с тем, как вы вставляете данные в свою базу данных, поэтому проблема может быть вообще не связана с загрузкой файлов.
Некоторые андроиды действительно загружаются с использованием приложения mime-типа 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
На стороне 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()); }
Я знаю его немного поздно, но я думаю, что этот ответ может помочь и другим народам.
Я нашел это на: 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
не типа mime, заданного $_FILE[type]
. Это может быть неправильно, поэтому угадайте тип mime самостоятельно. Специально, когда устройства различны, как в этом случае андроид.