2012-03-17 27 views
6

Tôi vừa thành công khi viết tệp lên Google Cloud Storage và đọc tệp đó. Mọi thứ đều ổn sau khi tôi triển khai ứng dụng lên appspot, nhưng tôi gặp lỗi khi chạy ứng dụng đó tới địa chỉ:Cách truy cập tệp Cloud Storage từ Ứng dụng đang chạy tại địa phương

INTERNAL_SERVER_ERROR 
    Caused by:java.io.IOException 
     at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:586) 
     at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:561) 
    ...... 

Có ai trong số các bạn biết cách truy cập tệp Google Cloud Storage từ máy chủ cục bộ không?

Trả lời

7

Môi trường kiểm tra nhà phát triển App Engine hỗ trợ mô phỏng cục bộ của Google Cloud Storage nhưng không cung cấp quyền truy cập RPC vào thực tế. Vì vậy, mã của bạn nên hoạt động trong cả hai môi trường, nhưng bạn nên nghĩ đến hai chế độ là có không gian tên và nội dung riêng biệt. Vì vậy, nếu, ví dụ, mã của bạn dự kiến ​​sẽ thấy một foo nhóm cụ thể chứa thanh đối tượng, bạn sẽ muốn tạo riêng nhóm/đối tượng đó và đảm bảo nó chứa nội dung hợp lý để chế độ nhà phát triển địa phương hoạt động như mong đợi.

-1

Để chạy nó "giả" cục bộ (như trên dòng lệnh), trước tiên bạn nên triển khai và sau đó sử dụng HttpClient để kết nối với máy chủ của bạn. Bằng cách đó bạn có thể tương tác với servlet của bạn/jsp từ dòng lệnh và không phải nộp tờ với file đính kèm tập tin

Mẫu mã [Bạn chắc chắn có thể lấy thêm sáng tạo hơn thế]

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.methods.HttpUriRequest; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.client.ClientProtocolException; 


public class FileUploaderClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws ClientProtocolException, IOException{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://<app-version>.<app-name>.appspot.com/<servlet-name>"); 
     MultipartEntity reqEntity = new MultipartEntity(); 
     FileBody bin = new FileBody(new File("<File you want to upload>")); 
     reqEntity.addPart("file", bin); 
     httppost.setEntity(reqEntity); 
     HttpResponse response = httpclient.execute(httppost); 
     System.out.println(response.getStatusLine()); 

    } 

} 

Bây giờ bạn sẽ phải khả năng gọi servlet của bạn trong một vòng lặp chẳng hạn thay vì gửi biểu mẫu của bạn nhiều lần

0

Tôi có thể tìm và sử dụng dịch vụ mô phỏng được đề cập ở trên. Thật không may cho chủ đề này, tôi không biết Java. Nhưng đó là việc sử dụng bằng Python là như sau ...

$ python2.7 google_appengine/google/appengine/tools/api_server.py --application myapp 

(Lưu ý api_server.py đòi hỏi Python 2.7 vì nó phụ thuộc vào mô-đun argparse.)

Người khác sẽ phải tìm ra cách để làm giống nhau trong Java. Lấy làm tiếc. :(

EDIT: Các api_server.py là trong thư mục cơ sở:

$ python2.7 google_appengine/api_server.py 
Các vấn đề liên quan