الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أحدد حجم الملف المرفوع ؟

بدأه sada_rohak في 10 ديسمبر 2011 · 5 رد · 1,108 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

واجهتني مشكله كيف اتحقق من حجم ملف معين قبل التعامل معه في bottle

#!/usr/bin/python
# -*- coding: utf-8 -*- 

from bottle import route, run, request

@route('/upload')
def upload_form():

    return '''<form action="/upload" method="post" enctype="multipart/form-data">
                <input type="text" name="name" />
                <br>
                <input type="file" name="data" />
                </br>
                <input type="submit" value="upload" />
              </from>'''

@route('/upload', method='POST')
def do_upload():
    name = request.forms.get('name')
    data = request.files.get('data')
    if name!=None and data !=None:
        raw = data.file.read() # This is dangerous for big files
        filename = data.filename
        return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

run(host='localhost', port=8080)

يعني كيف أتحقق من حجم الملف قبل قرائته بدون تحميله بالذاكره

        raw = data.file.read() # This is dangerous for big files

فلو رفع أحدهم ملف بحجم كبير يتخطى حجم الذاكره وبالتالي يعمل كراش للسيرفر

"تم رفع الملف في المرفق لمن أراد التجريب"

upload.tar.gz

#2

وعليكم السلام ورحمة الله

لا يمكن الوصول إلى خصائص الملف قبل رفعه, ولكن يمكنك استخدام HTTP content-lenght Header لهذه المهمة فإذا كانت قيمة هذا الـ Header كبيرة أوقف عملية الرفع!

جرب عمل التالي:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from bottle import route, run, request

@route('/upload')
def upload_form():

	return '''<form action="/upload" method="post" enctype="multipart/form-data">
            	<input type="text" name="name" />
            	<br>
            	<input type="file" name="data" />
            	</br>
            	<input type="submit" value="upload" />
          	</from>'''

@route('/upload', method='POST')
def do_upload():
	name = request.forms.get('name')
	data = request.files.get('data')
	size = 2000000
	ReqLength = request.header.get('Content-length')
	if not ReqLength:
		return "No Content-Length specified!"
	elif int(ReqLength) > size:
		return "Too Large Request Body size!"
	if name!=None and data !=None:
		raw = data.file.read() # This is dangerous for big files
		filename = data.filename
		return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))

run(host='localhost', port=8080)

تم تعديل هذه المشاركة بواسطة MoHaMMaD Pro في 12 ديسمبر 2011 في 18:29

1

Everything will be fine when we TALK LESS, DO MORE


#3

اشكرك اخي محمد على المساعده

تظهر لدي مشكله لو حملت ملف كبير

لا أعلم ما هي المشكله هنا هل هي من المتصفح

ام قراءة الملف من السيرفر؟

جرب رفع ملف كبير وانظر لإستهلاك الرام عندك

هنا هي مشكلتي

#4

السلام عليكم

جرب هذا الكود

#this program use python 32
from os import *
def getLengthInBits(fileName):
    return path.getsize(fileName)

# here the file name
fileName = "c:\\python32\\NEWS.txt"

print(" length of : ", fileName," in bits is ", getLengthInBits(fileName))

print(" length of : ", fileName," in kilobits is ",
      getLengthInBits(fileName) / 1024)
1
#5

لم أنتبه لردك, الكود الذي وضعته لك يساعدك في عمل limit لحجم الملفات المسموح رفعها بالتالي يرجع رسالة خطأ عند محاولة رفع ملف حجمه أكبر من قيمة المتحول size, وليس للمساعدة في رفع الملفات الكبيرة

بدا من طلبك أنك تريد عمل قيود على حجوم الملفات

في حال كنت تبحث عن طريق افضل لرفع الملفات الكبيرة, فجرب الفكرة الموجودة في هذا الرابط

بتوفيق الله..

1

Everything will be fine when we TALK LESS, DO MORE


#6

biginner2000

وعليكم السلام

المشكله يا أخي تحصل أثناء كتابة الملف

وطريقتك تأتي ما بعد الكتابه

يعني أثناء الكتابه كانت المشكله ان الملف يحمل بالرام أولا ومن ثم يكتب

فكان الحل جعل الكتابه بعدة أجزاء وليس دفعه واحده

وتم إستخدام كودك بعد عملية الكتابه حتى يتم التأكد من حجم الملف وبالتالي حذفه إذا خالف الحجم المسموح

شكرا لك

------------------

أشكرك أخي MoHaMMaD Pro

نحن مجبرون على التحكم برفع الملفات الكبير

فالطريقه التقليديه ربما تنفع لمركز تحميل شخصي لملفاتك الخاصه الصغيره

لكن لو عملت مركز تحميل للزوار مثلا وحمل أحدهم ملف كبير راح يتفلل الرام أثناء عملية الكتابه وبالتالي عمل كراش للسيرفر

كنت قد شاهدت الرابط الذي وضعته البارحه أي قبل أن تضعه بساعه تقريبا :lol:

والحمدلله بعد التجارب وإستخدام الاكواد الموجوده بنفس الرابط الذي وضعته

قللت من إستهلاك موارد الجهاز وليس منع الطفح فقط

الان يمكن رفع الملف بأي حجم ومن ثم التحقق من حجمه بدون مشاكل ولكن بعد تحميله :)

شكرا على مساعدتي

الكود النهائي للفائده

#!/usr/bin/python
# -*- coding: utf-8 -*-

from bottle import route, run, request, debug, response
import bottle
import os, sys


try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

def fbuffer(f, chunk_size=10000):
   while True:
      chunk = f.read(chunk_size)
      if not chunk: break
      yield chunk

from os import *
def getLengthInBits(fileName):
    return path.getsize(fileName)


@route('/')
def upload_form():
        return '''<form action="/" method="post" enctype="multipart/form-data">                <br>
                <input type="file" name="data" />
                </br>
                <input type="submit" value="upload" />
                </from>'''

@route('/', method='POST')
def do_upload():
    data = request.files.get('data')
    if data !=None:
        fn = data.filename
        return fn
        f = file(fn, 'wb')
        x=data.file
        for chunk in fbuffer(x):
            f.write(chunk)
        f.close()
        fileName = fn
        sizefile=getLengthInBits(fileName)
        return "%s"%sizefile



if __name__ == "__main__":
    debug(True)
    run(reloader=True)

جزاكم الله خيرا جميعا وجعلها في موازين حسناتكم

بفضل من الله ثم منكم تم حل المشكله

مواضيع مشابهة