2012-11-29 144 views
0

我在java中使用下面的代码通过网络在php服务器上传图像。在android中将文件和图像上传到php服务器

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.util.Log; 

public class UploadFiles { 

    public void upload(String selectedPath) throws IOException { 
     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     DataInputStream inStream = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "AaB03x87yxdkjnxvi7"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     String urlString = "http://android.1mohammadi.ir/nightly/upload_files.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("uploaded_file", selectedPath); 
      dos = new DataOutputStream(conn.getOutputStream()); 

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
        + selectedPath + "\"" + lineEnd); 
      dos.writeBytes(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 <span id="IL_AD4" class="IL_AD">write</span> 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); 
      // close <span id="IL_AD3" class="IL_AD">streams</span> 
      Log.e("Debug", "File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 
     } catch (MalformedURLException ex) { 
      Log.e("Debug", "error: " + ex.getMessage(), ex); 
     } catch (IOException ioe) { 
      Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
     } 
     // ------------------ read the SERVER RESPONSE 
     try { 
      inStream = new DataInputStream(conn.getInputStream()); 
      String str; 

      while ((str = inStream.readLine()) != null) { 
       Log.e("Debug", "Server Response " + str); 
      } 
      inStream.close(); 

     } catch (IOException ioex) { 
      Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
     } 
    } 
} 

而且在PHP服务器使用这样的:

<?php 
// Where the file is going to be placed 
$target_path = "/uploads/"; 

/* Add the original filename to our target path. 
Result is "uploads/filename.<span id="IL_AD5" class="IL_AD">extension</span>" */ 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

error_log("Upload File >>" . $target_path . "\r\n", 3, "Log.log"); 

if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file " . basename($_FILES['uploadedfile']['name']) . 
     " has been uploaded"; 
} else { 
    echo "There was an error uploading the file, please try again!"; 
    echo "filename: " . basename($_FILES['uploadedfile']['name']); 
    echo "target_path: " . $target_path; 
} 
?> 
android系统中的代码

不发生任何错误,并且在PHP代码也。当文件上传不能移动文件时。我该如何解决这个问题? 谢谢。

+0

你检查过上传是否成功的PHP端? $ _FILES中的'['error']'参数应该**总是被检查。 –

+0

@MarcB没有错误。 –

+0

@MarcB我使用'error_log(“上传文件>>”.basename($ _ FILES ['uploadedfile'] ['name'])。“\ r \ n”,3, “Log.log”);'和输出为:'上传文件>>上传/ 上传文件>> ' –

回答

0

这可能是写入上传目录的问题。确保/uploads/目录存在并可以由Web服务器写入。

你也可以用use curl来测试你的服务器代码。一旦这个工作,你可以继续让客户的工作。

+0

上传目录是存在的。 –

7

我在服务器上使用此代码:

<?php 
$target_path = "./uploads/"; 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

error_log("Upload File >>" . $target_path . $_FILES['error'] . " \r\n", 3, 
    "Log.log"); 

error_log("Upload File >>" . basename($_FILES['uploadedfile']['name']) . " \r\n", 
    3, "Log.log"); 

if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file " . basename($_FILES['uploadedfile']['name']) . 
     " has been uploaded"; 
} else { 
    echo "There was an error uploading the file, please try again!"; 
} 
?> 

和android中使用此代码:

package ir.mohammadi.android.nightly.tools; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class UploadFiles { 

    public void upload(String selectedPath) throws IOException { 

     HttpURLConnection connection = null; 
     DataOutputStream outputStream = null; 
     DataInputStream inputStream = null; 

     String pathToOurFile = selectedPath; 
     String urlServer = "http://android.1mohammadi.ir/nightly/upload_files.php"; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 

     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 

     try { 
      FileInputStream fileInputStream = new FileInputStream(new File(
        pathToOurFile)); 

      URL url = new URL(urlServer); 
      connection = (HttpURLConnection) url.openConnection(); 

      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 

      connection.setRequestMethod("POST"); 

      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("Content-Type", 
        "multipart/form-data;boundary=" + boundary); 

      outputStream = new DataOutputStream(connection.getOutputStream()); 
      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      outputStream 
        .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" 
          + pathToOurFile + "\"" + lineEnd); 
      outputStream.writeBytes(lineEnd); 

      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      buffer = new byte[bufferSize]; 

      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      while (bytesRead > 0) { 
       outputStream.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      } 

      outputStream.writeBytes(lineEnd); 
      outputStream.writeBytes(twoHyphens + boundary + twoHyphens 
        + lineEnd); 

      int serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 

      fileInputStream.close(); 
      outputStream.flush(); 
      outputStream.close(); 
     } catch (Exception ex) { 
     } 
    } 
} 

更多信息请这个link

+0

你救了我的命!谢谢 – Houssem

0

1mohammadi.ir回答得很好。我只想在他的代码上添加一些内容。

要调用上传函数,您需要在另一个线程(而不是主线程)内调用。 通过这样做,请点击此链接。 How to fix android.os.NetworkOnMainThreadException?

+0

感谢您的有用通知 –

0
private void postFile() { 
    try { 

     // Url to upload file to. Mine points to my folder in xampp 
     String postReceiverUrl = "http://ipv4_address/webinterface/UploadToServer.php"; 
     Log.v("Some message", "postURL: " + postReceiverUrl); 

     // new HttpClient 
     HttpClient httpClient = new DefaultHttpClient(); 

     // post header 
     HttpPost httpPost = new HttpPost(postReceiverUrl); 

     // Gets the image from my drawable folder and compresses it 
     Bitmap bm = BitmapFactory.decodeResource(getResources(), 
       R.drawable.goku); 
     File file = new File(getExternalCacheDir().toString(), "goku.jpg"); 
     FileOutputStream outStream = new FileOutputStream(file); 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 
     outStream.flush(); 
     outStream.close(); 

     // Uri.fromFile(file); 

     // File file = new 
     // File(Environment.getExternalStorageDirectory(),"goku.jpg"); 
     // file.getAbsolutePath(); 
     FileBody fileBody = new FileBody(file); 

     MultipartEntity reqEntity = new MultipartEntity(
       HttpMultipartMode.BROWSER_COMPATIBLE); 
     reqEntity.addPart("file", fileBody); 
     httpPost.setEntity(reqEntity); 

     // execute HTTP post request 
     HttpResponse response = httpClient.execute(httpPost); 
     HttpEntity resEntity = response.getEntity(); 

     if (resEntity != null) { 

      String responseStr = EntityUtils.toString(resEntity).trim(); 
      Log.v("Some message", "Response: " + responseStr); 
     } 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

<?php if($ _ FILES){ $ file = $ _FILES ['file']; $ fileContents = file_get_contents($ file [“tmp_name”]); file_put_contents(“text.jpeg”,$ fileContents); } ?>这是我的php文件 – user5116554