我有一个带有cd /apache-vcs/git/repos
git init --bare main.git
的表单,尝试保存上传的图像时出现错误。该图像通过POST XMLHttpRequest上传。我不知道为什么会这样。
views.py:
<input type="file">
models.py:
import datetime
from django.shortcuts import render
from .models import TemporaryImage
def upload_file(request):
key = f'{request.user}-{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
for file in request.FILES.get('file'):
img = TemporaryImage(image=file, key=key)
img.save()
def home_view(request):
return render(request, 'products/home.html', {})
urls.py:
from django.db import models
def get_temp_image_path(instance, filename):
return os.path.join('tmp', str(instance.id), filename)
class TemporaryImage(models.Model):
image = models.ImageField(upload_to=get_temp_image_path, blank=True, null=True)
key = models.CharField(max_length=100)
模板“ home.html”:
from django.contrib import admin
from django.urls import path
from products.views import upload_file, home_view
urlpatterns = [
path('admin/', admin.site.urls),
path('', home_view, name='home'),
path('upload/', upload_file, name='upload_file')
]
完整堆栈跟踪:
<!DOCTYPE html>
<html>
<head>
<title>SO Question</title>
<script>
function uploadFile() {
var fd = new FormData();
fd.append("file", document.getElementById('file').files[0]);
var value = [];
document.getElementsByName('csrfmiddlewaretoken').forEach(function(x) {
value.push(x.value);
})
fd.append('csrfmiddlewaretoken', value[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", '/upload/');
xhr.send(fd);
}
</script>
</head>
<body>
<form enctype="multipart/form-data" method="POST">
{% csrf_token %}
<label for="file">Select a File to Upload</label>
<input type="file" id="file" name="file">
<input type="button" onclick="uploadFile()" value="Upload">
</form>
</body>
</html>
可能是什么问题?
答案 0 :(得分:2)
您仅上传单个文件;您不应该遍历文件密钥。
def upload_file(request):
key = f'{request.user}-{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
file = request.FILES.get('file')
if file:
img = TemporaryImage(image=file, key=key)
img.save()
答案 1 :(得分:1)
我想您也尝试过这样保存图像:
from django.core.files.base import ContentFile
...
def upload_file(request):
key = f'{request.user}-{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
file = request.FILES.get('file')
if file :
img = TemporaryImage.objects.create(key=key)
img.image.save(key, ContentFile(file), save=True)