2011-01-31 29 views
8

Tôi có cơ sở dữ liệu từ xa với MySQL và tôi lưu trữ ảnh của người dùng ứng dụng của tôi trên cơ sở dữ liệu dưới dạng hàng của cơ sở dữ liệu với loại LONGTEXT.Làm thế nào để sử dụng BLOB với JSON và PHP?

Tôi chuyển ảnh thành chuỗi bằng Base64.

Tôi kết nối với cơ sở dữ liệu từ xa với JSON và PHP, bởi vì điều này, tôi phải sử dụng Base64, vì như tôi biết, JSON và PHP cần gửi chuỗi trên tham số và Base64 tôi có thể biến ảnh thành chuỗi.

Nó hoạt động tốt, nhưng nó rất chậm. Khi tôi tải một bức ảnh 100 KB, phải mất rất nhiều thời gian, nhưng khi tôi tải một bức ảnh 5 KB chỉ mất hai hoặc ba giây.

Một người bạn bảo tôi sử dụng BLOB thay vì Base64, nhưng làm cách nào để sử dụng BLOB với JSON và kết nối PHP với cơ sở dữ liệu? Ngoài ra, tôi cần phải lưu trữ hình ảnh trên một hàng của bảng USER. Điều này là do người dùng không có đặc quyền tải tệp lên máy chủ từ xa nhưng họ có thể tải lên ảnh bằng cách tải chúng lên dưới dạng một chuỗi trong hàng của bảng USER.

nhờ

EDIT:

đây là mã nơi phải mất một thời gian looot chờ (nó đợi trong dòng: while ((line = reader.readLine()) != null) {, nó đang đợi reader.readLine())

mã này được một người dùng từ cơ sở dữ liệu từ xa, phải mất một thời gian để hiển thị người dùng trên ứng dụng của tôi

public Friend RetrieveOneUser(String email) 
{ 

    Friend friend=null; 

    String result = ""; 
    //the parameter data to send 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("email",email)); 

    //http post 
    InputStream is=null; 
    try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(this.BaseURL + this.GetOneUser_URL); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
    }catch(Exception e){ 
      Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 
    //convert response to string 
    try{ 

      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
      } 
      is.close(); 

      result=sb.toString(); 
    }catch(Exception e){ 
      Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    //parse json data 
    try{ 
      JSONArray jArray = new JSONArray(result); 


      for(int i=0;i<jArray.length();i++) 
      { 
        JSONObject json_data = jArray.getJSONObject(i); 
        friend=new Friend(json_data.getString("email"),json_data.getString("password"), json_data.getString("fullName"), json_data.getString("mobilePhone"), json_data.getString("mobileOperatingSystem"),"",json_data.getString("photo")); 
      } 
    } 
    catch(JSONException e){ 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
    } 

    return friend; 
} 
+3

Lưu trữ hình ảnh trong cơ sở dữ liệu (thay vì lưu trữ tham chiếu đến tệp trong hệ thống tệp từ xa) có thể là một động thái xấu. Có một câu hỏi rất hay đang xem xét chủ đề này một cách chi tiết: [Lưu trữ hình ảnh trong DB - Yea hoặc Nay?] (Http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or- này) –

+0

tôi không thể lưu trữ một tham chiếu đến một tập tin trong các filesistem từ xa vì USERS của APP không thể tải lên hình ảnh vào sistem từ xa ..... tôi đã nói với nó trong câu hỏi của tôi, tại sao ai đó đã cho tôi một bỏ phiếu tiêu cực ?? – NullPointerException

+0

tại sao người dùng không thể tải ảnh lên hệ thống? – binnyb

Trả lời

8

Segment yêu cầu thành hai phần:

  • tải đầu tiên JSON với tất cả mọi thứ ngoại trừ hình ảnh, trả về một tham chiếu đến hình ảnh như một URL thay vì
  • Second tải hình ảnh dưới dạng đoạn nhị phân, có khả năng không đồng bộ tùy thuộc vào ứng dụng

Tôi giả sử bạn có một cái gì đó như http://example.com/userinfo/xxx làm điểm cuối trả về JSON? Thêm một điểm cuối như http://example.com/userinfo_image/xxx để chỉ trả lại hình ảnh, sau đó bạn có thể trả về nó như là một đoạn nhị phân thay vì Base64 mã hóa nó trong JSON.

Điều này có nghĩa là bạn thực hiện hai yêu cầu HTTP thay vì một, nhưng tùy thuộc vào ứng dụng bạn có thể tải ảnh không đồng bộ và nếu như vậy bạn thường nhận được lợi ích lớn trong thời gian phản hồi của ứng dụng.

Đối với thông tin về hình ảnh tải lười biếng trong nền thấy bài đăng trên blog nhà phát triển Android cho một mẫu:

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

Nếu bạn không thể tải lười biếng hình ảnh xem xét việc làm yêu cầu song song cho cả hai hình ảnh và JSON cùng một lúc. Với phiên bản nhị phân của hình ảnh lấy băng thông mạng ít hơn rất nhiều và xử lý ít hơn nhiều khi bạn nhận được dữ liệu trên thiết bị cầm tay, nó vẫn có vẻ nhanh hơn rất nhiều.

0

Sự chậm chạp đến từ jso n/base64 mã hóa 100K dữ liệu hoặc từ lần truy cập cơ sở dữ liệu? Nó có lẽ từ mã hóa, và đặt các tập tin trong hệ thống tập tin (như tất cả mọi người trong các ý kiến ​​đang khóc), trên quy mô nhỏ, sẽ không tạo ra một chút khác biệt.

Thực hiện một số phép đo trên các phần khác nhau của thao tác và cố gắng xác định lý do tại sao tốc độ của nó chậm. Tôi không biết làm thế nào khác bạn sẽ nhận được một hình ảnh blob vào một chuỗi mã hóa json mà không base64, tôi giả sử bạn có thể thử và thoát khỏi tất cả mọi thứ, mà có thể chỉ là chậm, và hy vọng các phân tích cú pháp không bị nghẹt thở trên nó.

Bạn có đang sử dụng hàm json_encode trong php hay xây dựng chuỗi theo cách thủ công không? Hãy thử xây dựng nó theo cách thủ công. Bạn có base64 mã hóa dữ liệu thô từ cơ sở dữ liệu, hoặc nó được mã hóa trước khi nó được lưu trữ, bạn nên mã hóa nó trước khi nó được lưu trữ để tiết kiệm thời gian khi xuất ra.

+0

sự chậm trễ đến từ mã hóa json/base64 100K dữ liệu, bạn có mã chính xác chậm trên câu hỏi của tôi, tôi đã chỉnh sửa nó – NullPointerException

+0

Vì vậy, sự chậm chạp là ở phía khách hàng? Tất cả các vấn đề của mysql và php có thể có lẽ đã bị bỏ qua câu hỏi, và mọi người có thể đã trả lời nhiều hơn thay vì tập trung vào điều sai trái. Không thể giúp bạn ở đó. – profitphp

1

Để trả lời câu hỏi của bạn: Không, JSON không hỗ trợ dữ liệu nhị phân, bạn phải thoát khỏi nó theo cách nào đó trước khi gửi. Lưu trữ nó như BLOB trong MySQL sẽ không sửa chữa các vấn đề cơ sở hạ tầng chính mà bạn có. Từ những gì tôi hiểu rằng bạn có một thiết bị Android đang tải hình ảnh lên máy chủ PHP, máy chủ PHP này mã hóa hình ảnh thành Base64, đưa nó vào chuỗi JSON và sau đó đăng nó lên một điều khiển từ xa (cách điều khiển từ xa từ xa? cùng một trung tâm dữ liệu? trên toàn quốc? trên toàn thế giới? trong không gian bên ngoài quay quanh mặt trăng?) Máy chủ MySQL thông qua một giao diện HTTP của một số loại, rằng máy chủ MySQL lưu trữ hình ảnh Base64 như LONGTEXT. Để lấy lại hình ảnh, Máy khách Android gửi yêu cầu tới PHP, PHP gửi yêu cầu đến máy chủ MySQL từ xa, PHP sau đó phải giải mã Base64 và gửi nó xuống.

Điều này cực kỳ kém hiệu quả, bạn sẽ phải chịu độ trễ mỗi bước của con đường.

Edit: sao nó trông như thế này là một vấn đề phía khách hàng và không phải là một vấn đề phía máy chủ ...

Nếu đó là trường hợp sau đó tôi muốn đề nghị kiểm tra các bài viết @Uploading images to a PHP server from Android như họ nên có một số ví dụ hiệu quả hơn.

1

Tại sao không đổ hình ảnh của bạn dưới dạng tệp trên máy chủ và trả về url của tệp được ghi trong json của bạn? Đây thực sự là cách bạn nên làm những gì bạn muốn làm vì http là giao thức bạn nên sử dụng để chuyển hình ảnh qua web.

Mã tương tự như thế này nên làm những gì bạn muốn trên máy chủ

//code to get your row from database 

    //Code that writes it to a file. 
    $Data = $row['myblobfield']; 

    $fp = fopen('myimgname.jpg', 'w'); 
    fwrite($fp, $Data); 

    fclose($fp);  

này sẽ viết blob của bạn hoặc lĩnh vực longtext như một tập tin trên máy chủ của bạn sau đó bạn có thể tải về từ ứng dụng di động của bạn. Sau đó bạn có thể xóa các tệp tạm thời này sau một khoảng thời gian.

Hy vọng điều này rất hữu ích

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