2012-06-22 26 views
6

Tôi tải lên hình ảnh trong android. Hiện tại mã của tôi chỉ tải lên tệp nhưng tôi cũng muốn gửi một số tham số. Tôi đang thử theo dõilàm thế nào để gửi các thông số với tập tin trong android

FileInputStream fileInputStream = new FileInputStream(sourceFile); 
     URL url = new URL(upLoadServerUri); 
     conn = (HttpURLConnection) url.openConnection(); // Open a HTTP connection to the URL 
     conn.setDoInput(true); // Allow Inputs 
     conn.setDoOutput(true); // Allow Outputs 
     conn.setUseCaches(false); // Don't use a Cached Copy 
     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", fileName); 
     dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ fileName + "\"" + lineEnd); 
     dos.writeBytes(lineEnd); 

     //Sending data 
     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"paramName\"" + lineEnd); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(globalUID); 

và ở phía máy chủ Tôi đang sử dụng php. đây là cách tôi đang cố gắng lấy thông số đó

$param = $_POST["paramName"]; 
target_path1 = "./places_photos/" . $param; 

Nhưng mã hiện tại của tôi không tải lên tệp nhưng không gửi thông số. Làm thế nào tôi có thể gửi các thông số và làm thế nào tôi có thể nhận được chúng ở phía máy chủ?

Cập nhật

Hiện nay, hình ảnh được lưu trong thư mục places_photos được đề cập trong $target_path1 biến. Những gì tôi muốn là lưu hình ảnh đó vào thư mục của người dùng và thư mục đó được đặt tên là id người dùng. Nhưng tiếc là tôi không nhận được userid ở phía máy chủ. Làm thế nào tôi có thể gửi userid đến máy chủ cùng với tập tin?

Trả lời

0

Nên có một lineEnd thêm vào sau này:

dos.writeBytes(twoHyphens + boundary + lineEnd); 
    dos.writeBytes("Content-Disposition: form-data; name=\"paramName\"" + lineEnd); 
    dos.writeBytes(lineEnd); 
    dos.writeBytes(globalUID); 
    dos.writeBytes(lineEnd); <-- add this 

Ngoài ra hãy chắc chắn rằng bạn thêm vào cuối của ranh giới nhiều phần dữ liệu (các dòng bắt đầu với '-') Trong trường hợp của bạn, thêm này:

dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
+0

này không hoạt động nữa. Bất kỳ giải pháp nào khác? – 2619

+0

Bạn có thể sử dụng một công cụ như Firebug hoặc Wireshark và theo dõi bài đăng biểu mẫu được gửi tới máy chủ không? Dữ liệu đa phần/biểu mẫu rất khó hiểu về các dòng mới và ranh giới là chính xác 100%. – azgolfer

0

Bạn có muốn "làm" php biết tên tệp của mình không ?? nếu câu trả lời của bạn là có, vì vậy bạn có thể thực hiện một số thay đổi trên mã của mình.

(i giả sử bạn đã tạo ra một bộ đệm kích thước tối đa và đọc tập tin và viết nó vào form)

sự thay đổi đầu tiên bạn không cần điều này để gửi paramName:

//Sending data 
dos.writeBytes(twoHyphens + boundary + lineEnd); 
dos.writeBytes("Content-Disposition: form-data; name=\"paramName\"" + lineEnd); 
dos.writeBytes(lineEnd); 
dos.writeBytes(globalUID); 

chỉ làm này:

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

và trong chương trình PHP, thay đổi mã của bạn:

$param = $_POST["paramName"]; 

để

$param = basename($_FILES['uploaded_file']['name']); 

bạn có thể kiểm tra this bài viết

+0

Tôi muốn gửi tham số đến máy chủ. Php của tôi đã biết tên tệp của tệp. – 2619

+0

nếu bạn chỉ muốn gửi tham số đến máy chủ, bạn có thể thực hiện yêu cầu HTTP POST với HttpClient – yosafatade

0

Thiết lập một cookie với userid trong đó. Trên máy chủ, bạn có thể truy xuất cookie và kiểm tra userid. (Mặc dù lưu ý rằng điều này không an toàn và không chuyển tham số userid)

+0

Những gì bạn đề cập đến là một tùy chọn nhưng yêu cầu ứng dụng này là gửi tham số đến máy chủ có tải lên tệp. :( – 2619

0

Mã của bạn hơi khó hiểu, hãy kiểm tra lại các biến của bạn ... ví dụ: target_path1 không có $ ở trước, kiểm tra xem có của các biến sever khác trả về bất kỳ đầu ra hợp lệ nào.

Nếu tất cả thất bại, bạn có thể đổi tên tệp đang được tải lên - bao gồm các tham số trong tên tệp và đổi tên nó ở phía máy chủ một lần nữa sau khi trích xuất tham số.

0

này là rất đơn giản ...100% giải pháp làm việc

sử dụng UTF-8 để gửi tham số trong url. thêm dòng này

// open a URL connection to the Servlet 
       FileInputStream fileInputStream = new FileInputStream(sourceFile); 
       URL url = new URL("http://your fileaddress.php***?yourphpsideparametername="+URLEncoder.encode(yourperameter, "UTF-8")*** ); 

sau đó thứ hai thêm dòng này trong yêu cầu kết nối

   conn.setRequestMethod("POST"); 
       ***conn.setRequestProperty("Accept-Charset", "UTF=8");*** 
       conn.setRequestProperty("Connection", "Keep-Alive"); 

thêm dòng này vào mã php

$yourperameter =$_GET['yourparameter']; 
    $file_path = "doc/".$yourperameter."/"; 

    $file_path = $file_path . basename($_FILES['uploaded_file']['name']); 
    $title =$_FILES['title']; 
    //$descr=$file_path . basename($_FILES['uploaded_file']['desc']); 

    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) { 
     echo "success"; 
    } else{ 
     echo "fail"; 
    } 
Các vấn đề liên quan