روش آپلود کردن در python /pyqt(pyside)



  • p{direction:rtl; text-align:right}. سلام
    من ی برنامه ای با pyside نوشتم
    و الان برنامه نیاز داره که بتونه توی xfilesharing
    فایل آپلود کنه
    مشکل من چون که کلا با پایتون و پایساید خیلی جدید هستم(کلا با زبان سیستمی)نمیدونم باید چجوری هدر هارو ارسال کنم.یعنی کلا نمیدونم احتیاجات چی هستش
    قسمت کد آپلودر من به این صورت هستش
    @def upload(self, data, url):
    Temp = QtCore.QByteArray(data)
    if self._reply is None:
    request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
    request.setHeader(
    QtNetwork.QNetworkRequest.ContentTypeHeader,
    'multipart/form-data; boundary=---------------------------6550436631168000750764841')
    request.setRawHeader(
    QtNetwork.QNetworkRequest.ContentTypeHeader,
    'image/png')
    request.setHeader(
    QtNetwork.QNetworkRequest.ContentDispositionHeader,
    'form-data; name="image_field"; filename="icon.png"')
    request.setHeader(
    QtNetwork.QNetworkRequest.ContentLengthHeader,
    len(Temp))

            self._reply = self.parent().post(request, Temp)
            self._reply.uploadProgress.connect(self.handleUploadProgress)
            self._reply.finished.connect(self.handleFinished)@
    

    این هم فرم html من هستش که میخوام برای مثال ی عکس بفرستم
    @ <form enctype="multipart/form-data" method="post" action="123.php">
    <input type="file" size="32" name="image_field" value="">
    <input type="submit" name="Submit" value="upload">
    </form> @
    من از tamper که یک افزونه فایرفاکس هم هست استفاده کردم و این هدر هارو از اونجا گرفتم
    میشه لطفا راهنماییم کنید که کجای کارم اشتباس و باید چه چیزهایی رو تصحیح کنم
    ممنون از همگی



  • شما کدها رو داخل تگ کد بذارید که کسی که میخواد کمک کنه بتونه بخونه



  • [quote author="jmimi" date="1389710993"]شما کدها رو داخل تگ کد بذارید که کسی که میخواد کمک کنه بتونه بخونه[/quote]

    ممنون از شما
    پست تصحیح شد



  • من می دونم که این کار رو نباید بکنید
    @boundary=---------------------------6550436631168000750764841@
    این رو خود آپلودر می کنه حالا میخواد براوزر باشه یا هر چی دیگه که اینجا خود پایساید ه
    ضمنا شما نگفتیدکه این کار نکردن ه یعنی چی؟ یعنی خطا می گیرید یا اینکه هیچی آپلود نمیشه ؟



  • p{direction:rtl; text-align:right}. نه برنامه هیچ خطایی نداره,فقط فایل آپ نمیشه,کلی جستجو هم کردم ولی هنوز واقعا نمیدونم که طرز صحیح آپ کردن فایل چیه.هیچ ایده ای هم هنوز ندارم که چجوری حلش کنم متاسفانه,امیدوار بودم دوستان کمک کنن
    ممنون از پاسخ شما



  • اگه کد بیشتری بذارید شاید بشه کمکی کرد
    مثلا تو gist بذارید



  • p{direction:rtl; text-align:right}. من اولا هم میخواستم شروع کنم ی سری مشکل داشتم,بخاطره همین ی سوال پرسیدم و شخصی پاسخ داد,میتونین پاسخ رو در http://stackoverflow.com/a/20896359/3152155 ببینید
    بیس کد من بر پایه همین کد هستش,کلاس uploader رو من اصلا تغییری ندادم,یعنی تمام کد آپلودر من اونجا هست



  • من کد رو تست کردم، آپلود می کنه.
    اینکه شما جواب نمی گیرید به خاطر اینه که اون سایتی که دارید آپلود روش می کنید یه سری چک ها داره که شما پاس نمی کنید.
    مثلا
    session id
    cookie
    یا کلا یه فیلد خاصی که خودش گذاشته تا چک کنه که نرم افزاری نشه روش آپلود کرد
    مثل
    refferer
    در کل کدی که توی اون لینک استک آورفلو دادید درست کار می کنه



  • کد کاملا درست کار میکنه
    فایل آپلود میشه
    ولی فایل به هیچ جا آپلود میشه
    یعنی مشخص نیست که کجا میره
    شما فایل رو آپلود کردید و از اون طرف ذخیره شد تحویل گرفتین ؟



  • بله من فایل رو طرف سرور دیدم که داره میاد
    یعنی این روکوئست رو طرف سرور دیدم که میاد با حجم دیتایی که داره



  • ی سوال
    در داخل کد تغییری ایجاد کردید ؟
    من د لوکال تست میکنم که فکر نکنم نیاز به چیزی داشته باشه
    به نظرتون مشکل دیگه از چی میتونه باشه ؟



  • کد سرور لوکالتون چیه؟ یعنی می تونید اون رو بدید با اون تست کنم؟
    تغییری ندادم.
    شما طرف سرور می تونید ببینید که اون فایل داره میاد یا نه؟



  • متاسفانه منظورتون از کد سرور رو نمیدونم چی هست
    من ی هندلر خطا هم اضافه کردم به این صورت
    در کلاس
    uploader
    و متد
    upload
    من این کد رو اضافه کردم
    @self._reply.error.connect(self.handleError)@
    و بعدش این متد رو تعریف کردم
    @def handleError(self):
    print(self._reply.errorString())@

    وقتی که خطا رو پرینت میکنه مینویسه
    Connection refused

    آدرس رو هم این گذاشتم
    http://localhost:12345/01/upload/123.html
    ولی فایده ای نداره
    نمیدونم چطور اینکارو کنم که ببینم فایل میاد یا خیر



  • منظورم از کد سرور همین برنامه طرف سروره که روی پورت ۱۲۳۴۵ آوردید بالا.



  • راستش این دقیقا همین چیزیه که من متوجه نمیشم
    من اصلا پورتی تعیین نکردم
    این ۱۲۳۴۵ هم روی همون کد بود !
    من باید روی پورت ۸۰ کار کنم چون فکر کنم وبسایت های
    xfilesharing و کلا apache
    روی همین پورت هستش
    وقتی هم که :۱۲۳۴۵ رو برمیدارم قبل از اینکه پیام تمام شدن آپلود رو بده مینویسه
    operation canceled



  • این فایل داره از یک مبدایی به نام برنامه شما به یک مقصدی به نام سرور میره.
    من فکر می کنم که شما اصلا سروری ندارید. یعنی برنامه طرف سرور ندارید که دارید تست می کنید.
    کانکشن ویفیوز هم به همین خاطره. یعنی هیچی تو اون آدرسی که شما دارید میدید نیست.
    این http://localhost:12345/01/upload/123.html خالیه.
    باید یک برنامه سرور روی این آدرس باشه تا بتونه فایل شما رو بگیره و گر نه چی میخواد فایل شما بگیره؟!



  • دوستم واقعا ممنونم از کمکت به من
    منظورتون از برنامه سرور همون وب سرور هستش ؟
    من روی لوکال آپاچی دارم
    اون سایتی هم که در آخر باید روش کار کنم اسکریپت
    xfilesharing
    داره که روی آپاچی هستش
    ببخشید واقعا من در این زمینه اطلاعات ضعیفی دارم و دقیقا نمیدونم باید چیکار کنم.به همین خاطر به مشکل خوردم
    ممنون



  • خواهش می کنم.
    آره منظور همون وب سروره
    همین آپاچی خودش وب سروره ولی کار خاصی نمی کنه.
    شما باید یک برنامه ای داشته باشید که فایل رو ذخیره می کنه و روی این آپاچی بیاریدش بالا.
    آپاچی فقط پروتکل http رو پیاده سازی کرده . البته خیلی کارای دیگه می کنه که الان به دردمون نمی خوره.
    آپاچی رکوئست رو می گیره و تحویل اون برنامه ای میده که داره فایل رو ذخیره می کنه و روی خودش هاست کرده. هاست کرده یعنی اینکه آورده بالا.
    این برنامه هه همونیه که بهش اشاره کردم برنامه طرف سرور.



  • خیلی ممنون از کمکتون دوستم
    دوستم الان ی سری برنامه ها هستن که فایل رو آپلود میکنن روی هاست های فایل مثل "این":http://z-o-o-m.eu/
    تعداد زیادی هاست هم پشتیبانی میکنه
    تا اونجایی که من هم اطلاع دارم برای همین هاست مورد نظر من برنامه ای با زبان پرل نوشته شده که خود به خود فرم اچ تی ام ال رو پیدا میکنه(طبق هدر هایی که ارسال میشه) و فایل رو سابمیت میکنه بدون برنامه خاصی
    راهی هست که به این صورت بشه کار رو پیش برد ؟
    و اگر جواب منفی هستش
    میشه مستنداتی و یا مقاله ی ساده ای در این رابطه و همچنین اسم برنامه رو بگین تا من روی این کار کنم ؟
    ممنون



  • نه اینا به درد این کار نمی خوره. چون اینا یک کلاینت هستند.
    چیزی که مدنظر شماست اینه که کار همین ها رو انجام بدید.
    مگر اینکه یکی از این اپلیکیشن ها باشند که اپی داشته باشند و شما از اپی اونا تو برنامه کیوت خودتون استفاده کنید. اون موقع از شر اون اچ تی تی پی بازیا هم خلاص می شید.
    اگر هم اینا اپی ندارند و می خواید که روی یک اپلیکیشن سرور کار کنید ، یه سرچ بزنید که مثلا سمپل کد آپلود فایل تو پی اچ پی رو داشته باشه. بعدش اونو توی آپاچی بیاریدش بالا.



  • خیلی ممنون از لطف تون
    من با اطلاعاتی که شما بهم دادین باز هم تحقیق میکنم و اگر مشکلی داشتم(البته بازم ببخشید از سوالای زیاد من) سوالم رو همینجا مطرح میکنم
    موفق باشید



  • خواهش می کنم.
    فروم برای سوال پرسیدن و جواب دادن ه دیگه



  • سلام
    خب بعد از ی سری جستجو ها به ی جاهایی رسیدم
    "اینجا":http://paste.ofcode.org/4VQqLdMTTybPYL6HbBfcf2 یک کد هستش که بر روی آپلود روی
    http
    کار میکنه.منم کد خودمو رو طبق اون تغییر دادم ولی برنامه کرش میکنه و بسته میشه.کد برنامه منم "اینجاست":http://paste.ofcode.org/34B4t8QWF9dFEaa9nSMrRMP
    من متوجه نشدم کجای کار رو اشتباه انجام میدم.ی کمکی میدی شما ؟ ممنون



  • سلام
    چند تا مشکل وجود داره
    ۱) هنوز برنامه سرور رو راه ننداختید
    ۲) اون فایلی که باید آپلود بشه همونیه که تو سمپل ها اومده. این یعنی اینکه اون فایل رو هم من حدس میزنم که اصلا روی سیستم شما وجود نداره.
    البته مشکل اصلی که کرش می کنه از این نیست.
    من پایتون نمی دونم ولی اگر اون نتورک منجر رو توی خود متد آپلود بسازید اون موقع کرشی در کار نیست. نمیگم که این راه حله ها. فقط می گم که یه هینتی باشه برای حلش.



  • ممنون از کمکتون
    این کد کامل برنامه نیست.ی جورایی فقط برای اینه که نشون بدم چیکار میکنم
    وب سرور که از همون آپاچی میشه استفاده کردن.روی
    http
    پست میکنه اونور با پی اچ پی میگیریم
    ممنون از کمکتون.همین الان امتحان میکنم



  • سلام
    من مشکل کرش کردن رو حل کردم.گویا بعد از ارسال
    reply
    کلا بسته میشد
    الان کد اینه.ولی هنوز کد روی
    http
    آپلود نمیکنه.شما فکر میکنی بخش آپلودر چیزی کم داشته باشه؟هرکی نشون میدم میگه این کامله ظاهرا و باید کار کنه
    @from PyQt4 import QtCore, QtGui, QtNetwork
    import sys
    class Window(QtGui.QWidget):
    def init(self, parent=None):
    super(Window, self).init(parent)

        self.netaccess = QtNetwork.QNetworkAccessManager(self)
        self._uploaders = {}
        row = 1 #this number will change per upload in real program,this is just demo
        self.address = 'http://localhost/01/upload/demo.php'
        stream = QtCore.QFile&#40;'/home/patriot/hello.jpg'&#41;
        if stream.open(QtCore.QIODevice.ReadOnly):
            data = stream
        
            uploader = self._uploaders[row] = Uploader(row, self.netaccess)
        
            uploader.upload(data, self.address)
    

    class Uploader(QtCore.QObject):

    def __init__(self, key, parent):
        QtCore.QObject.__init__(self, parent)
        self._key = key
        self._reply = None
        
        
    def upload(self, data, url):
        if self._reply is None:
    
            self._stream = data
            
            self._multiPart = QtNetwork.QHttpMultiPart(QtNetwork.QHttpMultiPart.FormDataType)
            
            fileName = QtCore.QFileInfo(self._stream.fileName()).fileName()
            key = 'file'
            
            imagePart = QtNetwork.QHttpPart()
            imagePart.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                     "form-data; name=\"%s\"; filename=\"%s\"" % (key, fileName))
            imagePart.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                     'image/png')
            imagePart.setBodyDevice(self._stream)
            
            self._multiPart.append(imagePart)
    
            request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
            request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
    

    'multipart/form-data; boundary=%s' % self._multiPart.boundary())
    request.setRawHeader('User-Agent','Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')

            self._reply = self.parent().post(request, self._multiPart)
            self._reply.uploadProgress.connect(self.handleUploadProgress)
            self._reply.error.connect(self.handleError)
            self._reply.finished.connect(self.handleFinished)
            
            
            
    def handleUploadProgress(self, sent, total):
        #if sent >= total:
            # prevent duplicated uploads
            #self._reply.close()
            print()
    
    def handleFinished(self):
        print('Content: ',self._reply.readAll())#no output here :(
        self._stream.close()
        self._multiPart.deleteLater()
        self._reply.deleteLater()
        self._reply = None
        app.quit()
        
    def handleError(self):
        print('Error String :',self._reply.errorString())
        print('Error number: ',self._reply.error())
    

    app = QtGui.QApplication(sys.argv)
    demo = Window()
    sys.exit(app.exec_())@



  • آقا مشکل حل شد
    بعد از چندین روز تلاش تصادفی متوجه شدم که پای کیوت روی پایتون ۳ باگ داره
    در حقیقت این کد خیلی خوب روی پایتون ۲ کار میکنه ولی پایتون ۳ کار نمیکنه
    بازم ممنون



  • آها خیلی خوب
    من یه جواب به پست قبلی شما دادم ولی مثل اینکه اینترنتم مشکل داشت و الان می بینم که جواب ثبت نشده.
    خوبه که حل شد



  • ممنون
    برای کسانی که میخوان بدونن مشکل چیه.با برنامه
    wireshark
    من این دو هدر رو گرفته شد.اولی با پایتون ۲
    @MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "boundary_.oOo.Nzc0MjMxOTU4MTgyMzc5MTk0Mw==NzIxMTQzNjA4"@
    و در پایتون ۳
    @MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "b'boundary
    .oOo._NjY2OTgyMTQ3MTg1NTk1MzgyNw==NDY5Njg1NTMw'"@
    به قسمت
    boundary
    دقت کنید که به بایت تبدیل شده در پایتون ۳ و رشته متنی نیست
    من این مشکل رو گزارش دادم تا درست کنند
    موفق باشید


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.