android伺服器php上傳
服務端:(auth變數為使用者登入狀態驗證,這部分確認沒錯。)
if( $auth==1){ $target_path = ROOT.basename($_FILES['uploadedfile']['name']); echo $target_path; if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploaded_file']['name']). " has been uploaded"; } else{ echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error']; } }else{ echo 'error_login';}
用戶端:
private String uploadFile = Environment.getExternalStorageDirectory()+ "/" + packageName + "/" + "images" + "/" + "image.jpg";private String srcPath = Environment.getExternalStorageDirectory()+ "/" + packageName + "/" + "images" + "/" + "image.jpg";private String actionUrl = getTargetUrl(); //PHP串連 private void uploadFile(final String uploadUrl) { Thread thread = new Thread() { @Override public void run() { //DEBUG File file = new File(uploadFile); if(file.exists()){ Log.i("DEBUG","要上傳的檔案存在"); } String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); // 設定每次傳輸的流大小,可以有效防止手機因為記憶體不足崩潰 // 此方法用於在預先不知道內容長度時啟用沒有進行內部緩衝的 HTTP 要求本文的流。 httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K // 允許輸入輸出資料流 httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); // 使用POST方法 httpURLConnection.setRequestMethod("POST"); httpURLConnection.setRequestProperty("Connection", "Keep-Alive"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + srcPath.substring(srcPath.lastIndexOf("/") + 1) + "\"" + end); dos.writeBytes(end); FileInputStream fis = new FileInputStream(srcPath); byte[] buffer = new byte[8192]; // 8k int count = 0; // 讀取檔案 while ((count = fis.read(buffer)) != -1) { dos.write(buffer, 0, count); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); InputStream is = httpURLConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); String result = br.readLine(); dos.close(); is.close(); } catch (Exception e) { e.printStackTrace(); setTitle(e.getMessage()); } } }; thread.start(); }
運行後返回錯誤:(包含服務端接收頁面的連結)
報錯後運行也中止了,沒有收到服務端列印的任何資訊。
java.io.FileNotFoundException: http://.../upload.php
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:206)
Studio指示錯誤的行是:
InputStream is = httpURLConnection.getInputStream();
起初以為是本地檔案不存在,結果用檔案管理工具確認、包括代碼中檢查後也打出了“檔案存在“,可以確定的是用戶端檔案路徑沒錯。後來以為URL連結有問題,用電腦瀏覽器可以正常開啟,可以列印內容,所以服務端連結也應沒錯。
百思不得其解,搜尋很久也沒找到解決方案,特來求助。求老司機帶一帶。