code

플라스크에 저장하지 않고 파일 데이터 읽기

starcafe 2023. 7. 17. 21:16
반응형

플라스크에 저장하지 않고 파일 데이터 읽기

나는 나의 첫 플라스크 신청서를 쓰고 있습니다.저는 파일 업로드를 다루고 있으며, 기본적으로 제가 원하는 것은 업로드된 파일의 데이터/내용을 저장하지 않고 읽은 후 결과 페이지에 인쇄하는 것입니다.네, 저는 사용자가 항상 텍스트 파일을 업로드한다고 가정합니다.

사용 중인 간단한 업로드 기능은 다음과 같습니다.

@app.route('/upload/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            a = 'file uploaded'

    return render_template('upload.html', data = a)

지금은 파일을 저장하고 있지만, 파일의 내용/데이터를 포함할 'a' 변수가 필요합니다.무슨 생각이 있습니까?

FileStorage포함하다stream필드. 이 개체는 IO 또는 파일 개체를 확장해야 하므로 다음을 포함해야 합니다.read기타 유사한 방법. FileStorage또한 확장합니다.stream필드 개체 속성을 사용할 수 있습니다.file.read()대신file.stream.read()또한 사용할 수 있습니다.save와의 논쟁.dst로서의 파라미터.StringIO또는 복사할 다른 IO 또는 파일 개체FileStorage.stream다른 IO 또는 파일 개체로 이동합니다.

설명서 http://flask.pocoo.org/docs/api/ #flask.Request.files 및 http://werkzeug.pocoo.org/docs/datastructures/ #werkzeug.datastructures.FileStorage를 참조하십시오.

만약 당신이 표준 플라스크를 사용하고 싶다면 - 업로드된 파일 크기가 500kb 이상이면 임시 파일을 저장하지 않을 방법이 없습니다.500kb보다 작으면 "바이트"를 사용합니다.IO"는 파일 내용을 메모리에 저장하고 500kb 이상인 경우 내용을 TemporaryFile()에 저장합니다(werkzeug 설명서에 명시됨).두 경우 모두 업로드된 파일 전체가 수신될 때까지 스크립트가 차단됩니다.

이 문제를 해결하는 가장 쉬운 방법은 다음과 같습니다.

수신 데이터를 모두 처리할 수 있는 파일 형식의 IO 클래스를 만듭니다.

스크립트에서 요청 클래스를 자신의 클래스로 재정의합니다.

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )

Flask의 request_class를 사용자의 request_class로 바꿉니다.

app.request_class = MyRequest

가서 맥주 좀 마셔요 :)

솔루션 공유(모든 것이 플라스크의 Google 버킷에 연결하도록 이미 구성되어 있다고 가정)

from google.cloud import storage

@app.route('/upload/', methods=['POST'])
def upload():
    if request.method == 'POST':
        # FileStorage object wrapper
        file = request.files["file"]                    
        if file:
            os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = app.config['GOOGLE_APPLICATION_CREDENTIALS']
            bucket_name = "bucket_name" 
            storage_client = storage.Client()
            bucket = storage_client.bucket(bucket_name)
            # Upload file to Google Bucket
            blob = bucket.blob(file.filename) 
            blob.upload_from_string(file.read())

내 게시물

플라스크의 Google 버킷으로 이동

저는 똑같은 작업을 하려고 했습니다. 텍스트 파일(Panda를 위한 CSV)을 여는 것입니다.복사본을 만들고 싶지 않고 열고 싶을 뿐입니다.폼-WTF는 멋진 파일 브라우저를 가지고 있지만 파일을 열고 임시 파일을 만들어 메모리 스트림으로 표시합니다.비밀리에 일을 좀 하면,

form = UploadForm() 
 if form.validate_on_submit(): 
      filename = secure_filename(form.fileContents.data.filename)  
      filestream =  form.fileContents.data 
      filestream.seek(0)
      ef = pd.read_csv( filestream  )
      sr = pd.DataFrame(ef)  
      return render_template('dataframe.html',tables=[sr.to_html(justify='center, classes='table table-bordered table-hover')],titles = [filename], form=form) 

저는 판다를 이용하여 제 해결책을 공유합니다.


@app.route('/upload/', methods=['POST'])
def upload():
    if request.method == 'POST':
        # FileStorage object wrapper
        file = request.files["file"]                    
        if file:
            df = pd.read_excel(files_excel["file"])

@tbicr의 훌륭한 답변을 바탕으로 가장 간단한 형태는 다음과 같습니다.

for line in request.files.get('file'):
   print("Next line: " + line)

기능하고 있는

def handleUpload():
    if 'photo' in request.files:
        photo = request.files['photo']
        if photo.filename != '':      
            image = request.files['photo']  
            image_string = base64.b64encode(image.read())
            image_string = image_string.decode('utf-8')
            #use this to remove b'...' to get raw string
            return render_template('handleUpload.html',filestring = image_string)
    return render_template('upload.html')

html 파일로

<html>
<head>
    <title>Simple file upload using Python Flask</title>
</head>
<body>
    {% if filestring %}
      <h1>Raw image:</h1>
      <h1>{{filestring}}</h1>
      <img src="data:image/png;base64, {{filestring}}" alt="alternate" />.
    {% else %}
      <h1></h1>
    {% endif %}
</body>

인메모리 파일을 디스크에 덤프하려는 경우.이 코드를 사용할 수 있습니다.

  if isinstanceof(obj,SpooledTemporaryFile):
    obj.rollover()

언급URL : https://stackoverflow.com/questions/20015550/read-file-data-without-saving-it-in-flask

반응형