2012-03-18 19 views
6

Estoy intentando cargar imágenes con Android como frontend y django como back-end.Carga de la imagen de Android-Django

El modelo:

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 

La vista a la URL url (r '^ fotos/carga/$', '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') 

Ahora estoy tratando para acceder a la vista aquí desde Android. Así que ahora mi código del lado del androide para cargar la imagen es:

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

pero me da un error:

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

tal vez debería agregar alguna url real a 'urlString =" http: // "' – zapl

+0

en realidad yo ya ha agregado "private static String recordURL =" http://192.168.1.2/photos/upload/ ";" que está llamando a esta función de carga. pero todavía me está dando el error dado anteriormente – user1163236

+0

¿Utiliza la cadena que definió? 'URL url = new URL (recordURL);' – zapl

Respuesta

2

Debe ser urlString = "http://192.168.1.2/photos/upload";

Pero entonces, si no funciona , obtendrá un error diferente, y probablemente necesitemos ese error para responder más.

Además, parece que no tiene un conjunto de cuerdas de límite real y no lo está utilizando correctamente.

http://stunningco.de/2010/04/25/uploading-files-to-http-server-using-post-android-sdk/, observe cómo utiliza una cadena de límite única y la escribe en la secuencia de salida?

Debe comenzar a marcar sus preguntas como respondidas. Tendrás mucho mejor éxito para que te respondan cuando lo hagas.

0

Incluso después de superar estas dificultades, se encontrará con el requisito de Django de que proporcione un csrfmiddlewaretoken con sus parámetros POST. Y no veo cómo puede obtener eso en un dispositivo Android; por diseño, ese token está allí para evitar llamar al código de back-end de Django (es decir, una "vista") de cualquier cosa que no sea un frontend de Django (es decir, una "plantilla"). Es decir. está diseñado para frustrar hacer exactamente lo que estás tratando de hacer.

Puede deshabilitar la función csrf en una vista particular; utilice el decorador "@csrf_exempt". Y luego puede decidir si le importa lo suficiente sobre la seguridad, para encontrar un sustituto propio para lo que le da la cosa csrf.

O, en lugar de cargar una imagen desde una aplicación de Android, escriba una aplicación web para cargar una imagen, y haga que su proyecto Django sirva esa aplicación web. Su aplicación de Android podría iniciar el navegador (como un Intento) y apuntarlo a esa aplicación web. Aquí hay un código que lo hará: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html (No ganará ningún concurso de belleza, pero funciona)

Cuestiones relacionadas