Android-Django 图片上传

Posted

技术标签:

【中文标题】Android-Django 图片上传【英文标题】:Android-Django Image upload 【发布时间】:2012-04-03 06:40:16 【问题描述】:

我正在尝试使用 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'^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')

现在我正在尝试从 android 访问此处的视图。 所以现在我上传图片的android端代码是:

     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://

【问题讨论】:

也许你应该给urlString = "http://"添加一些真实的网址 实际上我已经添加了“private static String recordURL = "192.168.1.2/photos/upload/";",它正在调用这个上传函数。但它仍然给我上面给出的错误 你使用你定义的字符串吗? URL url = new URL(recordURL); 对不起输入错误它的'urlString' ***.com/a/55205683/6401241 【参考方案1】:

应该是urlString = "http://192.168.1.2/photos/upload";

但是如果它不起作用,你会得到一个不同的错误,我们可能需要这个错误来进一步回答。

此外,您似乎没有设置真正的边界字符串,并且您没有正确使用它。

看看here。注意到他如何使用唯一的边界字符串并将其写入输出流吗?

【讨论】:

【参考方案2】:

即使您克服了这些困难,您仍会违反 Django 的要求,即您提供带有 POST 参数的 csrfmiddlewaretoken。而且我看不出如何在 Android 设备上获得它。按照设计,该令牌用于防止从 Django 前端(即“模板”)以外的任何地方调用 Django 后端代码(即“视图”)。 IE。它旨在阻止你做你想做的事。

您可以在特定视图上禁用 csrf 功能——使用“@csrf_exempt”装饰器。然后你可以决定你是否足够关心安全性,找出你自己的替代品来代替 csrf 东西给你的东西。

或者,与其从 Android 应用上传图片,不如编写一个网络应用来上传图片,然后让您的 Django 项目为该网络应用提供服务。您的 Android 应用程序可以启动浏览器(作为 Intent)并将其指向该 Web 应用程序。这里有一些代码可以做到这一点:https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html(它不会赢得任何选美比赛,但它确实有效。)

【讨论】:

以上是关于Android-Django 图片上传的主要内容,如果未能解决你的问题,请参考以下文章

新手 想问下,上传图片到FastDfs后,如何在该虚拟机下找到上传的图片

怎样向网站上传图片

ASP.NET上传控件上传图片

我本地的图片怎么上传上去?就是图片要弄地址?

PHP Fckeditor 上传图片的问题

php 在多个上传图片时 怎么获取 要上传的图片宽高