先贴代码
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files.get('file')
token = request.headers.get('token')
if not token:
abort(401, '无效的访问令牌')
if not file or not allowed_file(file.filename):
return jsonify({'message': '不允许上传此类型的文件'}), 400
uploader = tokenserve.verify_token(token)
if not uploader:
return jsonify({'message': '无效的访问令牌'}), 401
file_hash = calculate_hash(file)
# 检查文件是否已存在
existing_file = Attachment.query.filter_by(unique_identification=file_hash).first()
if existing_file:
file_url = request.host_url + existing_file.file_path
return jsonify({
'file_url': file_url,
'img_id': existing_file.id,
})
folder = generate_upload_folder()
filename = datetime.now().strftime('%Y%m%d%H%M%S') + '_' + file.filename
filepath = os.path.join(folder, filename)
file.save(filepath)
file_path = '/uploads/' + datetime.now().strftime('%Y-%m-%d') + '/' + filename
# 计算文件的哈希值
# 获取文件信息
original_filename = file.filename
file_size = os.path.getsize(filepath)
print('original_filename', original_filename)
print('file_size', file_size)
# 存入数据库
user_id = uploader.get('user_id')
attachment = Attachment(
uploader=user_id,
original_filename=original_filename,
unique_identification=file_hash,
file_size=file_size,
file_path=file_path
)
db.session.add(attachment)
db.session.commit()
# 构建文件网络路径
file_url = request.host_url + 'uploads/' + datetime.now().strftime('%Y-%m-%d') + '/' + filename
print('file_url', file_url)
# return file_url
return jsonify({
'file_url': file_url,
'img_id': attachment.id,
})
问题的原因是:如果在获取文件哈希后保存文件,文件大小变成了0,可能是因为在计算哈希值时,文件指针已经移动到了文件的末尾,导致在保存文件时无内容可写入。
计算文件哈希通常需要读取文件的内容。当您计算完哈希值后,文件的读取指针可能已经到达文件的末尾,所以当您尝试保存文件时,文件内容为空,因为没有内容被写入。
要解决这个问题,您可以在计算哈希之前先将文件的指针重新设置到文件的开头位置。这样,计算哈希时不会影响文件的读取操作。
修改后的代码:
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files.get('file')
token = request.headers.get('token')
if not token:
abort(401, '无效的访问令牌')
if not file or not allowed_file(file.filename):
return jsonify({'message': '不允许上传此类型的文件'}), 400
uploader = tokenserve.verify_token(token)
if not uploader:
return jsonify({'message': '无效的访问令牌'}), 401
file_hash = calculate_hash(file)
file.seek(0)