Download Android Django Image

I am trying to download an image from Android as an interface and django as a backend.

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 

URL representation 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') 

Now I am trying to access the view here from Android. So, now my Android side code is for uploading the image:

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

but this gives me an error:

 E/Debug(590): error: java.net.URISyntaxException: Authority expected at index 7: http:// 
+6
source share
2 answers

Must be urlString = "http://192.168.1.2/photos/upload";

But if this does not work, you will get another error, and we will probably need this error to answer further.

Also, it looks like you do not have a real set of border lines, and you are not using it correctly.

http://stunningco.de/2010/04/25/uploading-files-to-http-server-using-post-android-sdk/ , notice how it uses a unique boundary line and writes it to the output stream?

You should start tagging your questions in response. You will have much better success if you answer them.

+2
source

Even after you overcome these difficulties, you will encounter Django's requirement that you provide a csrfmiddlewaretoken with POST parameters. And I do not understand how you can get this on an Android device; By design, this token is designed to prevent Django firewall code (i.e., "view") from being called from nothing other than the Django interface (i.e., "template"). That is, it is intended to prevent what you are trying to do.

You can disable the csrf function in a specific view - use the @csrf_exempt decorator. And then you can decide whether you care about security, work out your replacement for what csrf gives you.

Or instead of downloading an image from an Android application, write a web application to download the image and try running the Django project in this web application. An Android application can launch a browser (as an intention) and indicate it in this web application. Here is the code that will do this: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html (it won’t win beauty contests, but it really works.)

0
source

Source: https://habr.com/ru/post/911032/


All Articles