Мы с хорошим результатом использовали скрипт для нашей игры, которая подключается к php-файлу для загрузки файлов на удаленный сервер. Когда мы обновляемся до Android 4.03, скрипт внезапно не может подключиться к серверу, и мы не знаем, почему. Он отлично работает с Android 2.3.4 и старше.
public static String uploadOrderFile(Context c) { String error = ""; HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream inStream = null; FileInputStream fileInputStream = null; String exsistingFileName = String.format("orders%d.ser", empire.getId()); String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1*1024*1024; String responseFromServer = ""; try { //------------------ CLIENT REQUEST // Opening streams. if(settings.isSaveToExternalStorage()) { File file = new File(Environment.getExternalStorageDirectory(), String.format("%sorders%s.ser", c.getString(R.string.pathExternalStorage), empire.getId())); fileInputStream = new FileInputStream(file); } else { fileInputStream = c.openFileInput(exsistingFileName); } // open a URL connection to the Servlet String s = c.getString(R.string.webPageOrders); URL url = new URL(s); // 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("Content-Type", "multipart/form-data;boundary="+boundary); dos = new DataOutputStream( conn.getOutputStream() ); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes(String.format("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"%s\"%s", exsistingFileName, 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); } catch(FileNotFoundException fnfe) { error = "Error. Couldn't find the order file internally."; Log.e(TAG, error, fnfe); } catch (MalformedURLException murle) { error = "Error. Couldn't create correct file URL."; Log.e(TAG, error, murle); } catch(ProtocolException pe) { error = "Error. Couldn't upload the order file to server."; Log.e(TAG, error, pe); } catch (IOException ioe) { error = "Error. Couldn't upload the order file to server."; Log.e(TAG, error, ioe); } finally { try { // Closing streams and connections. if(fileInputStream != null) { fileInputStream.close(); } if(conn != null) { conn.disconnect(); } if(dos != null) { dos.flush(); dos.close(); } } catch(IOException ioe) { error = "Error. Couldn't disconnect internet stream buffers."; Log.e(TAG, error, ioe); } } if(!error.equals("")) { return error; } //Reading the server response. try { inStream = new DataInputStream ( conn.getInputStream() ); String str; while (( str = inStream.readLine()) != null) { responseFromServer += str; } } catch (IOException ioe){ error = "Error. Couldn't read server response."; Log.e(TAG, error, ioe); } finally { try { // Closing streams. if(inStream != null) { inStream.close(); } } catch(IOException ioe) { error = "Error. Couldn't disconnect internet stream buffers."; Log.e(TAG, error, ioe); } } return error;}
На сервере у нас есть следующий PHP-файл:
<?php // Where the file is going to be placed $target_path = "orders/"; /* Add the original filename to our target path. Result is "orders/filename.extension" */ $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; chmod ("orders/".basename( $_FILES['uploadedfile']['name']), 0644); } else{ echo "There was an error uploading the file, please try again!"; echo "filename: " . basename( $_FILES['uploadedfile']['name']); echo "target_path: " .$target_path; }?>
Любая помощь с этой проблемой оценена. Почему это происходит с Android 4.03, когда он работает без ошибок с предыдущими версиями?
Спасибо!
попробуй это
class getEditingHUD extends AsyncTask<String, Long, Integer> { protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(HtmlViwer.this, null, "Please wait..."); } protected Integer doInBackground(String... params) { File file = new File(Environment.getExternalStorageDirectory(), "yourfile.html"); try { FileInputStream fis = new FileInputStream(file); String myserver = "http://your server/phpfile.php"; HttpFileUploader htfu = new HttpFileUploader(myserver, "noparamshere", Modules.currentProgram + ".html"); htfu.doStart(fis); } catch (Exception e) { Log.e("Error Readingfile", e.toString()); } return null; } protected void onPostExecute(Integer result) { super.onPostExecute(result); try { if (loading != null && loading.isShowing()) loading.dismiss(); } catch (Throwable t) { } } }
и этот класс HttpFileUploader
public class HttpFileUploader implements Runnable { URL connectURL; String params; String responseString; // InterfaceHttpUtil ifPostBack; String fileName; byte[] dataToServer; HttpFileUploader(String urlString, String params, String fileName) { try { connectURL = new URL(urlString); } catch (Exception ex) { Log.i("URL FORMATION", "MALFORMATED URL"); } this.params = params + "="; this.fileName = fileName; } void doStart(FileInputStream stream) { fileInputStream = stream; PrakitoServer(); } FileInputStream fileInputStream = null; void PrakitoServer() { String exsistingFileName = "print.html"; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; String Tag = "3rd"; try { // ------------------ CLIENT REQUEST Log.e(Tag, "Starting to bad things"); // Open a HTTP connection to the URL HttpURLConnection conn = (HttpURLConnection) connectURL .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("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + exsistingFileName + "\"" + lineEnd); dos.writeBytes(lineEnd); Log.e(Tag, "Headers are written"); // create a buffer of maximum size int bytesAvailable = fileInputStream.available(); int maxBufferSize = 1024; int bufferSize = Math.min(bytesAvailable, maxBufferSize); byte[] buffer = new byte[bufferSize]; // read file and write it into form... int 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); // close streams Log.e(Tag, "File is written"); fileInputStream.close(); dos.flush(); InputStream is = conn.getInputStream(); // retrieve the response from server int ch; StringBuffer b = new StringBuffer(); while ((ch = is.read()) != -1) { b.append((char) ch); } String s = b.toString(); Log.i("Response", s); dos.close(); } catch (MalformedURLException ex) { Log.e(Tag, "error: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e(Tag, "error: " + ioe.getMessage(), ioe); } } @Override public void run() { // TODO Auto-generated method stub }
}
вызовите метод uploadOrderFile в классе AsyncTask. вы это исправите
для класса AsyncTask обратитесь к этой ссылке Как выполнить некоторый код в асинхронном потоке Android UI?