[PyQt] form multipart file upload

IT it at geolab.org.uk
Thu Sep 17 05:09:08 BST 2009


I'm trying to upload a "binary" file, eg pdf, xls to the server.

Uploading .txt works ok but am somewhat confused as to how to deal with 
binary files, ie encoding to string.

Below is the snippet of code I've got at the moment attemping to load an xls

TIA
Pete


    def upload_file(self, params, file_path):
        print "======================= UPLOAD    =============="

        file_name = 
QtCore.QDateTime().currentDateTime().toString("hh_mm_ss") + ".xls"

        fileObj = QtCore.QFile(file_path)
        fileObj.open(QtCore.QIODevice.ReadOnly)

        ### Constants
        CRLF = "\r\n"
        BOUNDARY = "-----------------------------7d935033608e2"
        START_DELIM = "--" + BOUNDARY + CRLF

        ## Byte array to append to
        data = QtCore.QByteArray()

        ## Add the paramaters as form-data eg {'foo': 'bar', 'bar': 
'beer'}, This works OK
        for p_key in params:
            st = QtCore.QString(START_DELIM + ('Content-Disposition: 
form-data; name="%s"' % p_key) + CRLF + CRLF)
            st.append( "%s%s" % (params[p_key], CRLF) )
            data.append( st.toUtf8() ) # should this be utf8 ?

        ## Append the file - binary ## Problem is here
        st = QtCore.QString(START_DELIM + 'Content-Disposition: 
form-data; name="uploaded_file"; filename="%s";%s' % ( file_name, CRLF ))
        st.append("Content-Type: application/octet-stream" + CRLF + CRLF )
        st.append( fileObj.readAll() ) ## Reads the file as binary ??
        st.append( CRLF + "--" + BOUNDARY + "--" + CRLF )
        data.append( st.toUtf8() ) # should this be utf8 ?

        dataToSend = QtCore.QString(data).toAscii()
        print "payload size=", dataToSend.size() #, payload

        ## Constuct Request
        url = QtCore.QUrl(self.settings.upload_url)
        self.request.setUrl( url )
        self.request.setRawHeader("Content-Type", 'multipart/form-data; 
boundary="%s"' % BOUNDARY)
        
self.request.setHeader(QtNetwork.QNetworkRequest.ContentLengthHeader, 
QtCore.QVariant(dataToSend.size()) )

        ## Post to server
        self.reply = self.netMan.post( self.request, dataToSend )
        self.connect(self.reply, 
QtCore.SIGNAL("uploadProgress(qint64,qint64)"), self.file_upload_progress)
        self.connect(self.reply, QtCore.SIGNAL("finished()"), 
self.file_upload_finished)

    def file_upload_progress(self, foo, bar):
        print "prog", foo, bar):

    def file_upload_finished(self):
        print "finished upload"
        print self.reply.readAll()


More information about the PyQt mailing list