flask_wtfのFileFieldから受け取ったファイルの中身をハッシュ化してデータベースに登録しようとしたのですが,どのファイルを選択しても登録されるハッシュ値が同じになってしまいます.おそらくFileStorage object に原因があるのだと思うのですが,わかる方は教えていただけないでしょうか.FileFieldではファイルの中身を読み込めないのであれば,どのようにすればよいか教えてください.よろしくお願いいたします.
必要なimportは全て行われており,エラーは出ていないのでそこには問題はないと思います.
データを受け取るFileFieldはこれになります.
python
1class MalwareRegistrationForm(FlaskForm): 2 malware_name = StringField('Malware Name', validators=[DataRequired()]) 3 malware_file = FileField('Choose Malware file', validators=[FileRequired()]) 4 submit = SubmitField('Register') 5 6 def validate_malware_file(self, malware_file): 7 target = generate_file_hash(self.malware_file.data) 8 9 if Malware.query.filter_by(malware_hash=target).first(): 10 raise ValidationError('Malware hash has been registerd already!')
受け取ったファイルのハッシュ値を計算する関数はこれです.
python
1def generate_file_hash(file): 2 3 file_content = file.read() 4 file_content = hashlib.sha256(file_content) 5 return file_content.hexdigest()
ファイルを登録するデータベースのクラスがこれです.
python
1class Malware(db.Model, UserMixin): 2 3 __tablename__ = 'malware' 4 5 id = db.Column(db.Integer, primary_key = True) 6 malware_name = db.Column(db.String(64), index=True) 7 malware_hash = db.Column(db.String(128)) 8 9 # ファイルを受け取ってハッシュ化してのち登録 10 def __init__(self, malware_name, malware_file): 11 self.malware_name = malware_name 12 self.malware_hash = generate_file_hash(malware_file)
そして,ファイルの選択及びアップロード画面のview.py部分がこれです
python
1@check_blueprint.route('/addmalware', methods=['GET', 'POST']) 2@login_required 3def malware_register(): 4 form = MalwareRegistrationForm() 5 6 if form.validate_on_submit(): 7 malware = Malware(malware_name=form.malware_name.data, 8 malware_file=form.malware_file.data) 9 10 db.session.add(malware) 11 db.session.commit() 12 flash('Successfully registerd.') 13 return redirect(url_for('index')) 14 15 return render_template('register_malware.html', form=form)
なにか少しでも気付いたことがありましたら教えていただけると幸いです.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。