2012-03-18 49 views
6

Tôi đang cố gắng tải lên hình ảnh với Android làm giao diện người dùng và django làm phụ trợ.Android-Django Tải lên hình ảnh

Mô hình:

class Photo(models.Model): 
     title = models.CharField(max_length=255,blank=True) 
     photo = models.FileField(upload_to='photos') 
     description = models.TextField(blank=True) 
     uploaded = models.DateTimeField(auto_now_add=True) 
     modified = models.DateTimeField(auto_now=True) 

     class Meta: 
      db_table = 'media_photos' 

     def __unicode__(self): 
      return '%s' % self.title 

Quan điểm đến URL url (r '^ ảnh/upload/$', 'upload_photo'):

def upload_photo(request): 
form=PhotoForm(request.POST,request.FILES) 
if request.method=='POST': 
    if form.is_valid(): 
     image = request.FILES['photo'] 
     title1 ='' 
     new_image = Photo(title=title1,photo=image,description='') 
     new_image.save() 
     response_data=[{"success": "1"}] 
     return HttpResponse(simplejson.dumps(response_data), mimetype='application/json') 

bây giờ tôi đang cố gắng để truy cập chế độ xem ở đây từ android. Bây giờ side code android tôi để tải lên hình ảnh là:

 public void doFileUpload(String path){ 
     HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     DataInputStream inStream = null; 
     String lineEnd = "\r\n"; 
     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1*1024*1024; 
     String urlString = "http://"; // server ip 
     try 
     { 
     //------------------ CLIENT REQUEST 
     FileInputStream fileInputStream = new FileInputStream(new File(path)); 
     // 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("Content-Type", "multipart/form-data;boundary="+" "); 
     dos = new DataOutputStream(conn.getOutputStream()); 
     dos.writeBytes(lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + path + "\"" + 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 write 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(lineEnd); 

     // close streams 
     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); 
     } 
     } 
} 

nhưng nó mang lại cho tôi một lỗi:

E/Debug(590): error: java.net.URISyntaxException: Authority expected at index 7: http:// 
+1

có lẽ bạn nên thêm một số url thực vào 'urlString =" http: // "' – zapl

+0

thực sự tôi đã thêm "private static String recordURL =" http://192.168.1.2/photos/upload/ ";" đang gọi chức năng tải lên này. nhưng nó vẫn cho tôi lỗi ở trên – user1163236

+0

Bạn có sử dụng Chuỗi bạn đã xác định không? 'URL url = URL mới (recordURL);' – zapl

Trả lời

2

Nên urlString = "http://192.168.1.2/photos/upload";

Nhưng sau đó nếu nó không hoạt động , bạn sẽ gặp phải một lỗi khác và có thể chúng tôi sẽ cần lỗi đó để trả lời thêm.

Ngoài ra, có vẻ như bạn không có bộ chuỗi ranh giới thực và bạn không sử dụng chính xác.

http://stunningco.de/2010/04/25/uploading-files-to-http-server-using-post-android-sdk/, hãy lưu ý cách anh ấy sử dụng chuỗi ranh giới duy nhất và ghi chuỗi đó vào luồng đầu ra?

Bạn nên bắt đầu đánh dấu câu hỏi của mình là đã trả lời. Bạn sẽ có nhiều thành công tốt hơn khi họ trả lời khi bạn làm như vậy.

0

Ngay cả sau khi bạn vượt qua những khó khăn này, bạn sẽ chạy afoul yêu cầu của Django rằng bạn cung cấp một csrfmiddlewaretoken với tham số POST của bạn. Và tôi không thấy làm thế nào bạn có thể có được điều đó trên một thiết bị Android; bằng cách thiết kế mã thông báo đó để ngăn chặn việc gọi mã phụ trợ Django (tức là "chế độ xem") từ bất kỳ mục nào khác ngoài lối vào Django (tức là "mẫu"). I E. nó được thiết kế để ngăn chặn chính xác những gì bạn đang cố gắng làm.

Bạn có thể tắt tính năng csrf trên một chế độ xem cụ thể - sử dụng trình trang trí "@csrf_exempt". Và sau đó bạn có thể quyết định xem bạn có quan tâm đến vấn đề bảo mật hay không, để tự mình thay thế cho những gì mà điều csrf mang lại cho bạn.

Hoặc thay vì tải lên ảnh từ ứng dụng Android, hãy viết ứng dụng web để tải ảnh lên và có dự án Django của bạn phục vụ ứng dụng web đó. Ứng dụng Android của bạn có thể khởi chạy trình duyệt (dưới dạng Mục đích) và trỏ vào ứng dụng web đó. Dưới đây là một số mã sẽ làm điều đó: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html (Nó sẽ không giành được bất kỳ cuộc thi sắc đẹp nào, nhưng nó không hoạt động.)

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