2017-02-04 2 views
-1

Я пытаюсь загрузить несколько изображений, но кроме первого изображения в файле, все остальные изображения становятся поврежденными во время загрузки. Я могу просматривать первое изображение без проблем, но остальное нельзя просмотреть. окна говорят We can't open this file. Это почти похоже на расширение неизвестно.Загрузка нескольких изображений развращает всех, кроме первых - Flask

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

# view.py 
@myVacation_blueprint.route('/logVacation', methods=['GET', 'POST']) 
@login_required 
def log_vacation(): 
form = LogVacationForm() 

if request.method == 'POST': 
    if form.validate_on_submit(): 
     try: 
      # Get the image name 
      uploaded_images = request.files.getlist('photo') 
      for image in uploaded_images: 
       filename = secure_filename(image.filename) 
       # Get the extension 
       extension = filename.split('.')[1] 
       filename = filename.split('.')[0] 
       # Concatenate filename and current time 
       filename = str(filename) + str(time.time()) 
       # Hash the filename 
       hash_file_name = bcrypt.generate_password_hash(filename).decode('utf-8') 
       # Normalize 
       filename = "".join([c if c.isalnum() else "" for c in hash_file_name]) 
       # Add the extension 
       filename = filename + '.' + str(extension) 
       # Save the file 
       directory = _user_img_folder(form) 
       print(os.path.join(directory, filename)) 
       form.photo.data.save(os.path.join(directory, filename)) 
     except Exception as e: 
      print(e) 

     return render_template('myVacation.html') 
    else: 
     filename = None 
return render_template('logVacation.html', form=form, error=error) 


# forms.py 
class LogVacationForm(FlaskForm): 
vacation_name = StringField('Vacation Name', validators=[DataRequired(), Length(min=6, max=25)]) 
location = StringField('Location', validators=[DataRequired()]) 
with_who = StringField('With_Who') 
description = TextAreaField('Description', render_kw={ 
    'class': 'vacation_description', 
    'rows': 10 
}) 
photo = FileField('Select Images', validators=[ 
    # FileRequired(), 
    FileAllowed(['jpg', 'png'], 'Images only')], 
        render_kw={'multiple': True} 
       ) 

# logVacation.html 

# many lines.... 
<form class="logVacation" enctype=multipart/form-data role="form" method="post" action="/logVacation"> 
# Some other input 
{{ form.photo(multiple="multiple") }} 
# Some other input 
<button class="btn btn-sm btn-success" value="upload" type="submit">Done</button> 
</form> 

Что мне здесь не хватает?

Примечание: Я только заметил, что на view.py значение form.photo.data никогда не изменяется после первого имени изображения. По-видимому, он не получает данные для других изображений.

+1

Вы зацикливание над файлами, но вы всегда используете 'form.photo.data', чтобы сохранить в конце. Вместо этого используйте 'image'. – davidism

+0

@davidism Я не уверен, где и как вы хотите, чтобы я использовал «образ» вместо этого. – Leustad

+0

Вместо 'form.photo.data', как и любая другая часть этого блока кода. – davidism

ответ

1
  • Если вы используете form.validate_on_submit(), то if request.method == 'POST' может быть удален.

  • объект метода является файловым потоком (image), а не данными формы (form.photo.data).

Так же, как это:

if form.validate_on_submit(): 
    for image in request.files.getlist('photo'): 
     ... 
     image.save(os.path.join(directory, filename)) 
Смежные вопросы