Удаленная загрузка изображений отличается от разработки сервера - PullRequest
0 голосов
/ 04 июня 2018

Мой локальный сервер разработки и live development имеют одинаковый код и базу данных (все статические / медиа файлы загружаются в хранилище s3).

У меня есть модель Post с полем image.My Post имеет поле для загрузки изображений, которое загружается через AJAX в мое хранилище s3И на моем локальном, и на живом сервере изображение успешно загружено, и URL этого изображения в моем хранилище s3 сохранен.Поэтому, когда я отправляю сообщение на моем локальном сервере, оно не загружается снова, я просто указываю на URL при отображении изображения.

Однако мой удаленный сервер этого не делает.После того, как я загрузил изображение через AJAX, когда я отправляю форму Post, он затем отправляет изображение снова (показывает прогресс загрузки в моем браузере - 3%, 5%, 10% и т. Д. ...).

Есть идеи, почему это происходит?Мой код здесь:

модели

class Post(models.Model):
    image = models.FileField(null=True, blank=True)

просмотры

def post(request):
    if request.user.is_authenticated():
        form_post = PostForm(request.POST or None, request.FILES or None)
        if form_post.is_valid():
            instance = form_post.save(commit=False)
            instance.user = request.user
            ...
            if instance.image:
                instance.imageURL = "https://s3.us-east-2.amazonaws.com/my-bucket/media/%s" % filename
                instance.image = None #this prevents re-upload upon form submission

            instance.save()

            return HttpResponseRedirect('/')
        else:
            form_post = PostForm()

        context = {
            'form_post': form_post,
        }

        return render(request, 'post/post.html', context)
    else:
        return HttpResponseRedirect("/accounts/signup/")

просмотр ajax

def upload_image(request):
    random_filename = request.POST.get('random_filename')
    if request.is_ajax():
        if request.FILES:
            img = request.FILES.get('image')


        session = boto3.Session(
            aws_access_key_id=AWS_ACCESS_KEY_ID,
            aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        )
        s3 = session.resource('s3')

        s3.Bucket('my-bucket').put_object(Key='media/%s' % random_filename, Body=img)
        return HttpResponse()

    else:
        return HttpResponse()

шаблон

<input id="id_image" type="file" name="image" />

JS

$('input#id_image').on('change', function(e) {
    var file = $('input[type=file]')[0].files[0];
    var formData = new FormData();

    $('.add_file_div h3').hide();
    $('.add_file_label').css({
    'border-radius': '5px',
    'box-shadow': '5px',
    });
    var imagePath = URL.createObjectURL(e.target.files[0]);
    var random_filename = random_string();

    formData.append('image', file);
    formData.append('csrfmiddlewaretoken', $("input[name='csrfmiddlewaretoken']").val());
    formData.append('random_filename', random_filename);

    $.ajax({
        url: '/upload_image/',
        data: formData,
        type: 'POST',
        contentType: false,
        processData: false,
        success: function(){
            console.log('SUCCESSFULLY UPLOADED');
            $('.add_file_label').css('opacity', '1');
            $('.add_file_label').css('background', 'url(' + imagePath + ') scroll no-repeat center/cover');
            $('.loading_spinner').css('visibility', 'hidden');
        }
    });
    $('.add_file_label').css('background', 'url(' + imagePath + ') scroll no-repeat center/cover');
    $('.add_file_label').css('opacity', '0.4');
    $('.loading_spinner').css('visibility', 'visible');
    console.log(imagePath);

    $('.add_file_label').append('<input class="temp_s3_url" type="hidden" name="temp_s3_url">');
    $('.temp_s3_url').val(random_filename);
    $('input#id_imageURL').hide();
    $('#delete_preview_image').show();
});

PS: у моего nginx client_max_body_size 200m;, так что это не проблема

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что та же проблема может происходить и локально.Но когда вы находитесь локально, скорость достаточно высока, чтобы вы не могли видеть индикатор выполнения загрузки.Дело в том, что вы должны очистить свое поле file, когда вы успешно загрузили ajax

как выполнить сброс

внутри

success: function(){
  console.log('SUCCESSFULLY UPLOADED');
  $('.add_file_label').css('opacity', '1');
  $('.add_file_label').css('background', 'url(' + imagePath + ') scroll no-repeat center/cover');
  $('.loading_spinner').css('visibility', 'hidden');
}

Вы сбросили бы элемент файла, чтобы сделать его пустым значением, иначе он будет отправлен с формой.

Другой вариант может состоять в том, чтобы просто указать поле ввода файла id, а не name.Если к элементу input не прикреплено имя, он не будет отправлен с формой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...