2012-03-18 33 views
6

アンドロイドをバックエンドとして、djangoをバックエンドとして画像をアップロードしようとしています。Android-Django画像アップロード

モデル

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 URL(R '^写真/アップロード/ $'、 '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

多分あなたは実際のURLを 'urlString =" http:// " – zapl

+0

に追加する必要があります。既に "private static String recordURL =" http://192.168.1.2/photos/upload/ ";"このアップロード機能を呼び出しています。それでも私に上記のエラーが与えられています – user1163236

+0

定義した文字列を使用していますか? 'URL url =新しいURL(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を提供する必要があります。 Android搭載端末でどのように取得できるのか分かりません。 Djangoフロントエンド(すなわち、「テンプレート」)以外のものからDjangoバックエンドコード(すなわち、「ビュー」)を呼び出すことを防ぐトークンが存在するように設計されています。私。あなたがしようとしていることをまったくやり遂げることを妨げるように設計されています。

特定のビューでcsrf機能を無効にすることができます。「@csrf_exempt」デコレータを使用します。そして、あなたはセキュリティに関して十分気にしているかどうかを判断し、csrfのことがあなたに与えてくれるものの代わりに自分自身の代用品を見つけ出すことができます。

または、Androidアプリから写真をアップロードする代わりに、写真をアップロードするウェブアプリを作成し、Djangoプロジェクトにそのウェブアプリを提供させてください。あなたのAndroidアプリはブラウザを(Intentとして)起動し、そのWebアプリをポイントすることができます。 https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html(美容コンテストに勝つわけではありませんが、動作します)