2012-03-18 9 views
6

Próbuję przesłać obraz z Androidem jako frontend i django jako backend.Przesyłanie obrazu z systemu Android-Django

Model:

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 

Wgląd do adresu url (r '^ photos/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') 

teraz próbuję aby uzyskać dostęp do widoku tutaj z Androida. Więc teraz moja android kod bok, aby przesłać obraz jest:

 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); 
     } 
     } 
} 

ale daje mi błąd:

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

Może powinieneś dodać prawdziwy URL do 'urlString =" http: // "' – zapl

+0

faktycznie i dodano już "prywatny statyczny rekord StringURL =" http://192.168.1.2/photos/upload/ ";" który wywołuje tę funkcję przesyłania. ale nadal daje mi błąd podany powyżej – user1163236

+0

Czy używasz zdefiniowanego ciągu? 'URL URL = nowy adres URL (recordURL);' – zapl

Odpowiedz

2

Powinny być urlString = "http://192.168.1.2/photos/upload";

Ale jeśli to nie działa , pojawi się inny błąd i prawdopodobnie będziemy potrzebować tego błędu, aby odpowiedzieć dalej.

Wygląda również na to, że nie masz zestawu rzeczywistych linii brzegowych i nie używasz go poprawnie.

http://stunningco.de/2010/04/25/uploading-files-to-http-server-using-post-android-sdk/, zauważ, że używa on unikalnego łańcucha ograniczającego i zapisuje go w strumieniu wyjściowym?

Powinieneś zacząć oznaczać swoje pytania jako odpowiedzi. Będziesz mieć o wiele lepszy sukces, gdy odbierzesz im odpowiedź.

0

Nawet po pokonaniu tych trudności, uciekniesz od wymogu Django dostarczenia csrfmiddlewaretoken z parametrami POST. I nie widzę, jak można to uzyskać na urządzeniu z Androidem; według projektu, że token zapobiega kodowaniu kodu backendu Django (to jest "widoku") z niczego innego niż frontend Django (to jest "szablon"). To znaczy. jest zaprojektowany tak, aby uniemożliwić wykonanie dokładnie tego, co próbujesz zrobić.

Możesz wyłączyć funkcję csrf w określonym widoku - użyj dekoratora "@csrf_exempt". A potem możesz zdecydować, czy dbasz o bezpieczeństwo, wypracować substytut własnego, za to, co daje ci csrf.

Zamiast przesyłać obraz z aplikacji na Androida, napisz aplikację internetową, aby załadować zdjęcie, i poproś projekt Django o obsługę tej aplikacji internetowej. Twoja aplikacja na Androida może uruchomić przeglądarkę (jako cel) i wskazać ją w tej aplikacji internetowej. Oto kod, który to zrobi: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html (Nie wygra żadnych konkursów piękności, ale działa.)

Powiązane problemy