2012-02-07 8 views
2

ファイルをリモートサーバにアップロードするためにphpファイルに接続するスクリプトを使用しました。 Android 4.03にアップグレードすると、そのスクリプトは突然サーバーに接続できず、理由がわかりません。 Android 2.3.4以前ではうまくいきます。この問題を持つすべてのヘルプは高く評価されAndroid 4.03でPHP servarへのAndroid(Java)ファイルのアップロードが失敗する

<?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; 

}?> 

:私たちは、次のPHPファイルを持っているサーバー上

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;} 

。 Android 4.03でそれが失敗するのはなぜですか?それは以前のバージョンとまったく同じですか?

ありがとうございました!

+0

を試してみてください、このリンクを参照してくださいAsyncTaskクラスの

それを修正します。 – mbwasi

答えて

0

この

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 

} 

}

+0

こんにちは@prakash!出来た!どうもありがとうございました。 – Peter

0

AsyncTaskクラスでuploadOrderFileメソッドを呼び出します。あなたは How to execute some code in Android UI thread async?

+0

私はその固定されていない場合は教えてください.. – prakash

+0

こんにちは@プラカシ!それは助けになりませんでした。現時点では、次のコードを使用してuploadOrderFileを呼び出します。 – Peter

+0

'最終的なProgressDialogダイアログ= ProgressDialog.show(これは、 ""オーダーのアップロードです。新しいスレッド(new runnable(){public void run(){start();} – Peter

関連する問題