Я пытаюсь загрузить изображение из Android-приложения на сервер с PHP-скриптом. HTTP-ответ возвращает STATUS OK: 200, но $ _FILES ["upfile"] ["name"] возвращается пустым. Я проверял права доступа к папкам, а isady – 777.
Мой класс .java
/********************UPLOAD DATA*************************************/ class UploadImg extends AsyncTask<Void, Void, Void>{ NetworkInfo net; Messaging uActivity; HttpURLConnection connection = null; DataOutputStream outputStream = null; DataInputStream inputStream = null; String folderPath; String arrayOfFiles[]; File root; File allFiles; String urlServer = "http://bmcpublicidade.com.br/chat/upload.php"; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 10*1024*1024; URL url; ProgressDialog pDialog = new ProgressDialog(Messaging.this); @Override protected void onPreExecute() { Log.d(" UploadImg","onPreRequest"); pDialog.setMessage("Uploading GPS Data. Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected Void doInBackground(Void... params) { Log.d(" UploadData","doInBackground"); String fileName = ""+selectedPath; HttpURLConnection conn = null; DataOutputStream dos = null; BufferedReader inStream = null; String lineEnd = "rn"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 10*1024*1024; String responseFromServer = ""; String urlString = "http://bmcpublicidade.com.br/chat/upload.php"; try { //------------------ CLIENT REQUEST FileInputStream fileInputStream = new FileInputStream(new File(selectedPath) ); // open a URL connection to the Servlet URL url = new URL(urlString); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs conn.setDoInput(true); // Allow Outputs conn.setDoOutput(true); // Don't use a cached copy. conn.setUseCaches(false); // Use a post method. conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("enctype", "multipart/form-data"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); conn.setRequestProperty("upfile", fileName); dos = new DataOutputStream( conn.getOutputStream() ); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"upfile\"; filename='"+ selectedPath +"'" + lineEnd); dos.writeBytes(lineEnd); // create a buffer of maximum size bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // read file and write it into form... bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { dos.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) serverResponseCode = conn.getResponseCode(); String serverResponseMessage = conn.getResponseMessage(); Log.i("upfile", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode); if(serverResponseCode == 200){ runOnUiThread(new Runnable() { public void run() { String msg = "File Upload Completed.\n\n See uploaded file here : \n\n" +" http://**********/media/uploads/"; messageText.setText(msg); Toast.makeText(Messaging.this, "File Upload Complete.", Toast.LENGTH_SHORT).show(); } }); } // close streams Log.e("Debug","gravando arquivo: " + fileName); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { Log.e("Debug", "erro: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e("Debug", "erro: " + ioe.getMessage(), ioe); } //------------------ read the SERVER RESPONSE try { inStream = new BufferedReader ( new InputStreamReader(conn.getInputStream()) ); String str; while (( str = inStream.readLine()) != null) { Log.e("Debug","Servidor diz: "+str); } inStream.close(); } catch (IOException ioex){ Log.e("Debug", "erro: " + ioex.getMessage(), ioex); } return null; } @Override protected void onPostExecute(Void result) { Log.d(" UploadMSG","onPost"); pDialog.dismiss(); messageText.setText("Uploaded"); } } /********************END OF UPLOAD*************************************/
и вот мой php-файл
// Where the file is going to be placed $target_path = "uploads/"; /* Add the original filename to our target path. Result is "/uploads/filename.extension" */ $target_path = $target_path . basename( $_FILES['upfile']['name']); if( $_FILES['upfile'] ) { if(move_uploaded_file($_FILES['upfile']['tmp_name'], $target_path)) { // $qry = "UPDATE users set image=".$target_path." where username='$username'"; // $db->query($qry); echo "O arquivo ". basename( $_FILES['upfile']['name']). " está sendo enviado"; } else{ echo "Ocorreu um erro ao realizar envio de arquivo, por favor tente novamente!\n"; echo "Nome do arquivo: " . basename( $_FILES['upfile']['name'])."\n"; echo "target_path: " .$target_path; } }else { echo "Nenhum arquivo careregado!"; /*** ever enters here!!! ***/ }
Вы можете мне помочь?
благодаря !!!
Я только что столкнулся с той же проблемой. POST-файл успешно выполняется с ответом 200, но _FILES пуст. Я исправил проблему, указав заголовок Content-Length. Например:
conn.setRequestProperty("Content-Length", Integer.toString(fileInputStream.available()));
Edit: Таким образом, при использовании этого файла появился в _FILES, но с кодом ошибки 3. Однако у меня также был вызов conn.setChunkedStreamingMode (1024) ;. Удаление Content-Length и вызов setChunkedStreamingMode сработали для меня, но я уверен, что пустые _FILES связаны с неправильным заданием поля Content-Length.
Код выглядит отлично, но в вашем методе doInBackground AsyncTask измените строку LineEnd = "rn"; Строка lineEnd = "\ r \ n"; Должно сработать. Обратные косые черты гарантируют, что r, n не интерпретируются как буквы, а как специальные символы, r-возврат каретки и n-новая строка.
У меня такая же проблема. Я описал его здесь . В моем случае проблема возникает только тогда, когда я пытаюсь отправить файл с типом контента «multipart / form-data». И я не решал его, может быть, он имеет дело с php или сервером, но вопрос по-прежнему не отвечает.
В качестве временного решения я изменил тип запроса на тип сообщения по умолчанию (application / x-www-form-urlencoded) и передал изображение как base64. Может быть, это поможет.