#android #django #file-upload
#Android #django #загрузить файл
Вопрос:
Я пытаюсь загрузить свой файл не только в файл изображения, но и в любой файл с Android в указанный мной каталог django. Я попробовал некоторые методы в Интернете, но потерпел неудачу. Любые советы приветствуются.
столкнулся с проблемой: после выполнения кода Android django log возвращает код 200 без кода ошибки. Но что странно, так это то, что возвращается ответное сообщение, которое я никогда не предполагал. Я думаю, что ответное сообщение должно быть «успешным», но возвращается сообщение «OK», и ничего не сохраняется. Фактический переданный байт в длинном журнале равен 0 байтам.
Моя ссылка https://docs.djangoproject.com/en/3.1/topics/http/file-uploads /
===== Файлы Android =====
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView contentView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentView2=findViewById(R.id.content2);
HashMap<String, String> recordMap=new HashMap<>();
recordMap.put("name","GetUserFile");
RecordSender recordSender = new RecordSender();
recordSender.request("http://my_server_ip_address/recommender/GetUserFile/".concat("100"), recordMap, httpCallbackSend,"/data/data/com.example.servertest/databases/recommend.jpg");
}
HttpCallback httpCallbackSend=new HttpCallback() {
@Override
public void onResult(String result) {
try{
contentView2.setText(result);
}catch (Exception e){
e.printStackTrace();
}
}
};
}
RecordSender.java
public class RecordSender {
private static final String TAG = "RECORDSENDER";
RecordTask http;
public void request(String url, HashMap<String, String> param, HttpCallback callback, String filePath) {
http = new RecordTask(url, param, callback, filePath);
http.execute();
}
private class RecordTask extends AsyncTask<Void, Void, String> {
String url;
HashMap<String, String> param;
HttpCallback callback;
String filePath;
public RecordTask(String url, HashMap<String, String> param, HttpCallback callback, String filePath) {
this.url = url;
this.param = param;
this.callback = callback;
this.filePath = filePath;
}
@Override
protected String doInBackground(Void... voids) {
try {
URL text = new URL(url);
HttpURLConnection http = (HttpURLConnection) text.openConnection();
http.setRequestProperty("enctype", "multipart/form-data");
http.setRequestProperty("Content-Type", "multipart/form-data;");
http.setRequestProperty("Connection", "Keep-Alive");
http.setConnectTimeout(10000);
http.setReadTimeout(10000);
http.setRequestMethod("POST");
http.setDoInput(true);
http.setDoOutput(true);
http.setUseCaches(false);
http.connect();
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
DataOutputStream request = new DataOutputStream(http.getOutputStream());
//long fileSize = file.length();
//long totalReadBytes = 0;
int readBytes;
byte[] buffer = new byte[1024];
while ((readBytes = fis.read(buffer)) > 0)
request.write(buffer, 0, readBytes);
request.flush();
String resp = http.getResponseMessage();
return resp;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
@Override
protected void onPostExecute(String s) {
this.callback.onResult(s);
}
}
}
===== Файлы Django =====
forms.py из форм импорта django
class UploadFileForm(forms.Form):
file = forms.FileField()
settings.py
"""
Django settings for django_project project.
Generated by 'django-admin startproject' using Django 3.1.1.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'tm84)gy^7db*rb$k*h@4nokmgkqrqq(q*hamp;f06lzni_#=e8e6amp;'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["*"]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'recommender',
]
MIDDLEWARE = [
# 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'django_project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates']
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'django_project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
DATA_UPLOAD_MAX_NUMBER_FIELDS = 10240
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('GetUserFile/<str:ID>', views.GetUserFile, name='GetUserFile')
]
views.py
from django.shortcuts import render
from django.http import FileResponse
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.shortcuts import render
import os
import mimetypes
from shutil import copy
# Create your views here.
from .forms import UploadFileForm
from django.conf import settings
def GetUserFile(request, ID):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES, ID)
return HttpResponse("success")
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
def handle_uploaded_file(file, ID):
dirpath = './recommender/userprofile/' ID #specified file path
if not (os.path.isdir(dirpath)):
os.mkdir(dirpath)
with open('./recommender/userprofile/' ID '/filename', 'wb ') as destination:
for chunk in file.chunks():
destination.write(chunk)
Комментарии:
1. Хорошо… Что такое проблема / ошибка / исключение? Ваш код Android выглядит нормально.
2. После выполнения кода Android django log возвращает код 200 без кода ошибки. Но что странно, так это то, что возвращается ответное сообщение, которое я никогда не предполагал. Я думаю, что ответное сообщение должно быть «успешным», но возвращается сообщение «OK», и ничего не сохраняется. Фактический переданный байт в длинном журнале равен 0 байтам.