2012-03-18 11 views
6

मैं बैकएंड के रूप में एंड्रॉइड के साथ छवि को फ्रंटेंड और डीजेंगो के रूप में अपलोड करने की कोशिश कर रहा हूं।एंड्रॉइड-डीजेगो छवि अपलोड

मॉडल:

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 

दृश्य यूआरएल (आर '^ तस्वीरें/अपलोड/$', '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') 

अब मैं कोशिश कर रहा हूँ एंड्रॉइड से यहां देखने के लिए। तो अब छवि अपलोड करने के लिए अपने एंड्रॉयड पक्ष कोड है:

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

लेकिन यह मुझे एक त्रुटि देता है:

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

शायद आपको 'urlString = "http: //" ' – zapl

+0

पर कुछ असली यूआरएल जोड़ना चाहिए। पहले से ही "निजी स्थैतिक स्ट्रिंग recordURL =" http://192.168.1.2/photos/upload/ "जोड़ा है;" जो इस अपलोड फ़ंक्शन को कॉल कर रहा है। लेकिन यह अभी भी मुझे ऊपर दिए गए त्रुटि दे रहा है – user1163236

+0

क्या आप स्ट्रिंग का उपयोग करते हैं? 'यूआरएल यूआरएल = नया यूआरएल (recordURL); ' – zapl

उत्तर

2

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

लेकिन फिर अगर यह काम नहीं करता होना चाहिए , आपको एक अलग त्रुटि मिल जाएगी, और हमें शायद उत्तर देने के लिए उस त्रुटि की आवश्यकता होगी।

इसके अलावा, ऐसा लगता है कि आपके पास वास्तविक सीमा स्ट्रिंग सेट नहीं है और आप इसे सही तरीके से उपयोग नहीं कर रहे हैं।

http://stunningco.de/2010/04/25/uploading-files-to-http-server-using-post-android-sdk/, ध्यान दें कि वह एक अद्वितीय सीमा स्ट्रिंग का उपयोग कैसे करता है, और इसे आउटपुट स्ट्रीम में लिखता है?

आपको अपने प्रश्नों के उत्तर के रूप में चिह्नित करना शुरू करना चाहिए। जब आप ऐसा करते हैं तो आपको जवाब देने में बहुत बेहतर सफलता मिलेगी।

0

इन कठिनाइयों को दूर करने के बाद भी, आप Django की आवश्यकता से दूर भाग लेंगे कि आप अपने POST पैरामीटर के साथ csrfmiddlewaretoken की आपूर्ति करते हैं। और मैं नहीं देखता कि आप इसे एंड्रॉइड डिवाइस पर कैसे प्राप्त कर सकते हैं; डिजाइन द्वारा कि डैंजो बैकएंड कोड (यानी "व्यू") को Django फ्रंटएंड (यानी "टेम्पलेट") के अलावा किसी अन्य चीज़ से कॉल करने से रोकने के लिए टोकन है। अर्थात। यह वही करने के लिए डिज़ाइन किया गया है जो आप करने की कोशिश कर रहे हैं।

आप किसी विशेष दृश्य पर सीएसआरएफ सुविधा को अक्षम कर सकते हैं - "@csrf_exempt" सजावट का उपयोग करें। और फिर आप यह तय कर सकते हैं कि क्या आप सुरक्षा के बारे में पर्याप्त देखभाल करते हैं, सीएसआरएफ चीज आपको क्या देता है इसके लिए स्वयं के एक विकल्प का काम करने के लिए।

या, एंड्रॉइड ऐप से एक तस्वीर अपलोड करने के बजाय, एक तस्वीर अपलोड करने के लिए एक वेब ऐप लिखें, और अपने Django प्रोजेक्ट को उस वेब ऐप को पूरा करें। आपका एंड्रॉइड ऐप ब्राउज़र (एक इरादे के रूप में) लॉन्च कर सकता है और उसे उस वेब ऐप पर इंगित कर सकता है। यहां कुछ कोड दिया गया है जो यह करेंगे: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html (यह किसी भी सौंदर्य प्रतियोगिता नहीं जीत पाएगा, लेकिन यह काम करता है।)

संबंधित मुद्दे