2009-08-21 27 views
5

Tôi cần một cách để tải lên một tập tin và gửi nó vào trang php ...Tải lên và POST tập tin vào trang PHP với Java

trang php của tôi là:

<?php 
$maxsize = 10485760; 
$array_estensioni_ammesse=array('.tmp'); 
$uploaddir = 'uploads/'; 
if (is_uploaded_file($_FILES['file']['tmp_name'])) 
{ 
    if($_FILES['file']['size'] <= $maxsize) 
    { 
     $estensione = strtolower(substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], "."), strlen($_FILES['file']['name'])-strrpos($_FILES['file']['name'], "."))); 
     if(!in_array($estensione, $array_estensioni_ammesse)) 
     { 
      echo "File is not valid!\n"; 
     } 
     else 
     { 
      $uploadfile = $uploaddir . basename($_FILES['file']['name']); 
      echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n"; 
      if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) 
      { 
       echo "File is valid, and was successfully moved.\n"; 
      } 
      else 
       print_r($_FILES); 
     } 
    } 
    else 
     echo "File is not valid!\n"; 
} 
else 
{ 
    echo "Upload Failed!!!"; 
    print_r($_FILES); 
} 
?> 

và tôi sử dụng java này mã trong ứng dụng máy tính để bàn của tôi:

HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection(); 
     httpUrlConnection.setDoOutput(true); 
     httpUrlConnection.setRequestMethod("POST"); 
     OutputStream os = httpUrlConnection.getOutputStream(); 
     Thread.sleep(1000); 
     BufferedInputStream fis = new BufferedInputStream(new FileInputStream("tmpfile.tmp")); 

     for (int i = 0; i < totalByte; i++) { 
      os.write(fis.read()); 
      byteTrasferred = i + 1; 
     } 

     os.close(); 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(
       httpUrlConnection.getInputStream())); 

     String s = null; 
     while ((s = in.readLine()) != null) { 
      System.out.println(s); 
     } 
     in.close(); 
     fis.close(); 

Nhưng tôi luôn nhận được "Tải lên không thành công !!!" thông điệp.

+0

@Albe nó không thể tìm thấy biến 'totalByte' và' byteTrasferred'. Giá trị của các biến đó là gì? – alexandre1985

Trả lời

0

Bạn hiện không sử dụng đúng ngữ nghĩa tải lên tệp HTML. Bạn chỉ đăng một loạt dữ liệu lên url.

Bạn có 2 tùy chọn ở đây:

  • Bạn có thể giữ các mã java như nó vốn có, và thay đổi mã php để chỉ đọc POST liệu như một tập tin.
  • Thay đổi mã java để thực hiện tải lên tệp thực có thể sử dụng common library.

Tôi khuyên bạn nên thay đổi mã java để thực hiện việc này theo cách tuân thủ tiêu chuẩn.

+0

Cảm ơn nhưng tôi không muốn sử dụng thư viện bên ngoài ... Làm cách nào tôi có thể thay đổi mã php để chỉ đọc POST thô dưới dạng tệp? –

+0

Để thực hiện điều đó, bạn cần sử dụng ví dụ socket bên dưới. Được cảnh báo, đó sẽ là rất nhiều mã phụ và có lẽ rất nhiều thời gian dành cho việc gỡ lỗi. Nghiêm túc xem xét sự ác cảm của bạn với các thư viện bên ngoài. (Tôi hiểu đôi khi bàn tay của bạn bị trói, chỉ cần nhận ra nó có thể sẽ dễ dàng hơn nhiều) –

+0

nhưng cách dễ dàng hơn để tải lên tệp (hoặc dữ liệu) không tồn tại? –

4

Bạn cần sử dụng bài đăng được mã hóa nhiều biểu mẫu cho PHP để có thể đọc nó theo cách bạn đang cố gắng. This trang web phác thảo một cách tốt để làm điều đó và có liên kết đến các thư viện có thể giúp bạn ra ngoài.

3

Tất cả các câu trả lời ở trên chính xác 100%. Bạn cũng có thể sử dụng ổ cắm đơn giản, trong trường hợp này phương pháp của bạn sẽ trông như thế này:

 // Compose the request header 
     StringBuffer buf = new StringBuffer(); 
     buf.append("POST "); 
     buf.append(uploader.getUploadAction()); 
     buf.append(" HTTP/1.1\r\n"); 
     buf.append("Content-Type: multipart/form-data; boundary="); 
     buf.append(boundary); 
     buf.append("\r\n"); 
     buf.append("Host: "); 
     buf.append(uploader.getUploadHost()); 
     buf.append(':'); 
     buf.append(uploader.getUploadPort()); 
     buf.append("\r\n"); 
     buf.append("Connection: close\r\n"); 
     buf.append("Cache-Control: no-cache\r\n"); 

     // Add cookies 
     List cookies = uploader.getCookies(); 
     if (!cookies.isEmpty()) 
      { 
       buf.append("Cookie: "); 
       for (Iterator iterator = cookies.iterator(); iterator.hasNext();) 
        { 
         Parameter parameter = (Parameter)iterator.next(); 

         buf.append(parameter.getName()); 
         buf.append('='); 
         buf.append(parameter.getValue()); 

         if (iterator.hasNext()) 
          buf.append("; "); 
        } 

       buf.append("\r\n"); 
      } 

     buf.append("Content-Length: "); 

     // Request body 
     StringBuffer body = new StringBuffer(); 
     List fields = uploader.getFields(); 
     for (Iterator iterator = fields.iterator(); iterator.hasNext();) 
      { 

       Parameter parameter = (Parameter) iterator.next(); 

       body.append("--"); 
       body.append(boundary); 
       body.append("\r\n"); 
       body.append("Content-Disposition: form-data; name=\""); 
       body.append(parameter.getName()); 
       body.append("\"\r\n\r\n"); 
       body.append(parameter.getValue()); 
       body.append("\r\n"); 
      } 

     body.append("--"); 
     body.append(boundary); 
     body.append("\r\n"); 
     body.append("Content-Disposition: form-data; name=\""); 
     body.append(uploader.getImageFieldName()); 
     body.append("\"; filename=\""); 
     body.append(file.getName()); 
     body.append("\"\r\n"); 
     body.append("Content-Type: image/pjpeg\r\n\r\n"); 

     String boundary = "WHATEVERYOURDEARHEARTDESIRES"; 
     String lastBoundary = "\r\n--" + boundary + "--\r\n"; 
     long length = file.length() + (long) lastBoundary.length() + (long) body.length(); 
     long total = buf.length() + body.length(); 

     buf.append(length); 
     buf.append("\r\n\r\n"); 

     // Upload here 
     InetAddress address = InetAddress.getByName(uploader.getUploadHost()); 
     Socket socket = new Socket(address, uploader.getUploadPort()); 
     try 
      { 
       socket.setSoTimeout(60 * 1000); 
       uploadStarted(length); 

       PrintStream out = new PrintStream(new BufferedOutputStream(socket.getOutputStream())); 
       out.print(buf); 
       out.print(body); 

       // Send the file 
       byte[] bytes = new byte[1024 * 65]; 
       int size; 
       InputStream in = new BufferedInputStream(new FileInputStream(file)); 
       try 
        { 
         while ((size = in.read(bytes)) > 0) 
          { 
           total += size; 
           out.write(bytes, 0, size); 
           transferred(total); 
          } 
        } 
       finally 
        { 
         in.close(); 
        } 

       out.print(lastBoundary); 
       out.flush(); 

       // Read the response 
       BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       while (reader.readLine() != null); 
      } 
     finally 
      { 
       socket.close(); 
      } 
+0

nhưng cách tải lên tệp (hoặc dữ liệu) dễ dàng hơn không tồn tại? –

+0

Thats dễ dàng như nó được. Bất cứ điều gì khác chỉ là sử dụng thư viện. – Daniil

+0

không thể tìm thấy biến 'uploader' – alexandre1985

0

Tôi nhận ra điều này là một chút cũ nhưng tôi chỉ đăng một answer to a similar question rằng nên được áp dụng ở đây là tốt. Nó bao gồm mã tương tự như của Daniil, nhưng sử dụng HttpURLConnection thay vì một Socket.

11

Đây là một chủ đề cũ, nhưng vì lợi ích của người khác, đây là một dụ làm việc hoàn toàn chính xác những gì các op yêu cầu:

mã PHP server:

<?php 

$target_path = "uploads/"; 

$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"; 
} else{ 
    echo "There was an error uploading the file, please try again!"; 
} 

?> 

Java client mã:

import java.io.OutputStream; 
import java.io.InputStream; 
import java.net.URLConnection; 
import java.net.URL; 
import java.net.Socket; 

public class Main { 
    private final String CrLf = "\r\n"; 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.httpConn(); 
    } 

    private void httpConn() { 
     URLConnection conn = null; 
     OutputStream os = null; 
     InputStream is = null; 

     try { 
      URL url = new URL("http://localhost/test/post.php"); 
      System.out.println("url:" + url); 
      conn = url.openConnection(); 
      conn.setDoOutput(true); 

      String postData = ""; 

      InputStream imgIs = getClass().getResourceAsStream("/test.jpg"); 
      byte[] imgData = new byte[imgIs.available()]; 
      imgIs.read(imgData); 

      String message1 = ""; 
      message1 += "-----------------------------4664151417711" + CrLf; 
      message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"test.jpg\"" 
        + CrLf; 
      message1 += "Content-Type: image/jpeg" + CrLf; 
      message1 += CrLf; 

      // the image is sent between the messages in the multipart message. 

      String message2 = ""; 
      message2 += CrLf + "-----------------------------4664151417711--" 
        + CrLf; 

      conn.setRequestProperty("Content-Type", 
        "multipart/form-data; boundary=---------------------------4664151417711"); 
      // might not need to specify the content-length when sending chunked 
      // data. 
      conn.setRequestProperty("Content-Length", String.valueOf((message1 
        .length() + message2.length() + imgData.length))); 

      System.out.println("open os"); 
      os = conn.getOutputStream(); 

      System.out.println(message1); 
      os.write(message1.getBytes()); 

      // SEND THE IMAGE 
      int index = 0; 
      int size = 1024; 
      do { 
       System.out.println("write:" + index); 
       if ((index + size) > imgData.length) { 
        size = imgData.length - index; 
       } 
       os.write(imgData, index, size); 
       index += size; 
      } while (index < imgData.length); 
      System.out.println("written:" + index); 

      System.out.println(message2); 
      os.write(message2.getBytes()); 
      os.flush(); 

      System.out.println("open is"); 
      is = conn.getInputStream(); 

      char buff = 512; 
      int len; 
      byte[] data = new byte[buff]; 
      do { 
       System.out.println("READ"); 
       len = is.read(data); 

       if (len > 0) { 
        System.out.println(new String(data, 0, len)); 
       } 
      } while (len > 0); 

      System.out.println("DONE"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      System.out.println("Close connection"); 
      try { 
       os.close(); 
      } catch (Exception e) { 
      } 
      try { 
       is.close(); 
      } catch (Exception e) { 
      } 
      try { 

      } catch (Exception e) { 
      } 
     } 
    } 
} 

bạn có thể tìm hiểu cách điều chỉnh nó cho trang web của mình, nhưng tôi đã thử nghiệm mã trên và hoạt động. Tôi không thể mất tín dụng cho nó mặc dù >>See Original Post

+0

@CSchulz nếu tôi muốn gửi tệp văn bản, tôi nên thay đổi" Content-Type: image/jpeg "thành cái gì? – alexandre1985

+0

"văn bản/đồng bằng" sẽ hoạt động nếu bạn có US ASCII, nếu bạn cần một bộ ký tự khác, bạn cần chỉ định nó. – CSchulz

+0

để tương thích với Windows 7 thay đổi 'InputStream imgIs = getClass(). GetResourceAsStream ("/test.jpg ");' với 'FileInputStream imgIs = new FileInputStream (tệp mới (" test.jpg "));' – alexandre1985

17

Mặc dù các chủ đề rất cũ, có thể vẫn còn một ai đó xung quanh tìm kiếm một cách dễ dàng hơn để giải quyết vấn đề này (như tôi :))

Sau khi một số nghiên cứu tôi tìm thấy một cách để uplaod một tập tin mà không cần thay đổi mã Java của poster ban đầu. Bạn chỉ phải sử dụng PHP-mã sau:

<?php 
    $filename="abc.xyz"; 
    $fileData=file_get_contents('php://input'); 
    $fhandle=fopen($filename, 'wb'); 
    fwrite($fhandle, $fileData); 
    fclose($fhandle); 
    echo("Done uploading"); 
?> 

Mã này chỉ là lấy các dữ liệu thô được gửi bởi java-ứng dụng và viết nó vào một tập tin. Có, tuy nhiên một vấn đề: Bạn không nhận được tên tập tin ban đầu, vì vậy bạn phải truyền nó bằng cách nào đó khác.

tôi giải quyết vấn đề này bằng cách sử dụng một GET-Parameter, mà làm cho một sự thay đổi nhỏ trong Java mã cần thiết:

HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection(); 

thay đổi

HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php?filename=abc.def").openConnection(); 

Trong PHP-script của bạn bạn thay đổi dòng

$filename="abc.xyz"; 

đến

$filename=$_GET['filename']; 

Giải pháp này không sử dụng bất kỳ librarys bên ngoài và dường như đối với tôi đơn giản hơn nhiều so với một số những người đăng tải khác ...

Hy vọng tôi có thể giúp bất cứ ai :)

+0

Wow !! ! Đây là sức mạnh của sự đơn giản. Làm việc hoàn hảo, đơn giản để hiểu và mạnh mẽ. –

+0

Tại sao không phải 'file_put_contents ($ filename, $ fileData);'? – Sandman4

Các vấn đề liên quan