Пример #1
0
 def construct_multipart(self, data, files):
     multi_part = QtNetwork.QHttpMultiPart(
         QtNetwork.QHttpMultiPart.FormDataType)
     for key, value in data.items():
         post_part = QtNetwork.QHttpPart()
         post_part.setHeader(
             QtNetwork.QNetworkRequest.ContentDispositionHeader,
             "form-data; name=\"{}\"".format(key))
         post_part.setBody(str(value).encode())
         multi_part.append(post_part)
     for field, filepath in files.items():
         if filepath:
             file = QFile(filepath)
             if not file.open(QIODevice.ReadOnly):
                 break
             post_part = QtNetwork.QHttpPart()
             post_part.setHeader(
                 QtNetwork.QNetworkRequest.ContentDispositionHeader,
                 "form-data; name=\"{}\"; filename=\"{}\"".format(
                     field, file.fileName()))
             post_part.setBodyDevice(file)
             file.setParent(multi_part)
             multi_part.append(post_part)
         else:
             break
     return multi_part
Пример #2
0
    def make_request(self, url, data, filename):
        print(f"Making request to {url}")
        # Create the request object
        self.request = qtn.QNetworkRequest(url)

        # create the multipart object
        self.multipart = qtn.QHttpMultiPart(qtn.QHttpMultiPart.FormDataType)

        # Write the key-value data to the multipart
        json_string = json.dumps(data)
        http_part = qtn.QHttpPart()
        http_part.setHeader(qtn.QNetworkRequest.ContentTypeHeader, 'text/json')
        http_part.setBody(json_string.encode('utf-8'))
        self.multipart.append(http_part)

        # Write the file data to the multipart
        if filename:
            file_part = qtn.QHttpPart()
            filedata = open(filename, 'rb').read()
            file_part.setHeader(
                qtn.QNetworkRequest.ContentDispositionHeader,
                f'form-data; name="attachment"; filename="{filename}"')
            file_part.setBody(filedata)
            self.multipart.append(file_part)

        # Post the request with the form data
        self.nam.post(self.request, self.multipart)
    def upload_file(file_to_upload, post_url, key, callback):
        """Method for uploading files to GIS Cloud"""
        zip_part = QtNetwork.QHttpPart()
        zip_part_content_disposition = QByteArray(
            'form-data; name="upfile"; filename="{}"'.format(
                os.path.basename(file_to_upload)).encode('utf-8'))
        zip_part.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                           QByteArray(b'application/json'))
        zip_part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                           zip_part_content_disposition)

        file_handler = QFile(file_to_upload)
        file_handler.open(QIODevice.ReadOnly)
        zip_part.setBodyDevice(file_handler)

        multi_part = QtNetwork.QHttpMultiPart(
            QtNetwork.QHttpMultiPart.FormDataType)
        file_handler.setParent(multi_part)
        multi_part.append(zip_part)

        request = QtNetwork.QNetworkRequest()
        request.setRawHeader(QByteArray(b'X-GIS-CLOUD-APP'),
                             GISCloudNetworkHandler.app_id.encode("utf-8"))
        result = GISCloudNetworkHandler.blocking_request(
            GISCloudNetworkHandler.POST, post_url, key, multi_part, request,
            callback)
        return result
Пример #4
0
 def make_request(self, url, data, filename):
     self.request = qtn.QNetworkRequest(url)
     self.multipart = qtn.QHttpMultiPart(qtn.QHttpMultiPart.FormDataType)
     for key, value in (data or {}).items():
         http_part = qtn.QHttpPart()
         http_part.setHeader(qtn.QNetworkRequest.ContentDispositionHeader,
                             f'form-data; name="{key}"')
         http_part.setBody(value.encode('utf-8'))
         self.multipart.append(http_part)
     if filename:
         file_part = qtn.QHttpPart()
         file_part.setHeader(
             qtn.QNetworkRequest.ContentDispositionHeader,
             f'form-data; name="attachment"; filename="{filename}"')
         filedata = open(filename, 'rb').read()
         file_part.setBody(filedata)
         self.multipart.append(file_part)
     self.nam.post(self.request, self.multipart)
Пример #5
0
    def construct_multipart(self, data, files):
        multiPart = QtNetwork.QHttpMultiPart(
            QtNetwork.QHttpMultiPart.FormDataType)
        for key, value in data.items():
            textPart = QtNetwork.QHttpPart()
            textPart.setHeader(
                QtNetwork.QNetworkRequest.ContentDispositionHeader,
                "form-data; name=\"%s\"" % key)
            textPart.setBody(value)
            multiPart.append(textPart)

        for key, file in files.items():
            imagePart = QtNetwork.QHttpPart()
            #imagePart.setHeader(QNetworkRequest::ContentTypeHeader, ...);
            fileName = PyQt5.QtCore.QFileInfo(file.fileName()).fileName()
            imagePart.setHeader(
                QtNetwork.QNetworkRequest.ContentDispositionHeader,
                "form-data; name=\"%s\"; filename=\"%s\"" % (key, fileName))
            imagePart.setBodyDevice(file)
            multiPart.append(imagePart)
        return multiPart
Пример #6
0
    def requestWrite(self, node, fileName=None, *args, **kwargs):
        if self._stage != OutputStage.ready:
            raise OutputDeviceError.DeviceBusyError()

        if fileName:
            fileName = os.path.splitext(fileName)[0] + '.gcode'
        else:
            fileName = "%s.gcode" % Application.getInstance(
            ).getPrintInformation().jobName
        self._fileName = fileName

        # create the temp file for the gcode
        self._stream = StringIO()
        self._stage = OutputStage.writing
        self.writeStarted.emit(self)

        # show a progress message
        message = Message(
            catalog.i18nc("@info:progress",
                          "Saving to <filename>{0}</filename>").format(
                              self.getName()), 0, False, -1)
        message.show()
        self._message = message

        # send all the gcode to self._stream
        gcode = getattr(Application.getInstance().getController().getScene(),
                        "gcode_list")
        lines = len(gcode)
        nextYield = time() + 0.05
        i = 0
        for line in gcode:
            i += 1
            self._stream.write(line)
            if time() > nextYield:
                self._onProgress(i / lines)
                QCoreApplication.processEvents()
                nextYield = time() + 0.05

        # self._stream now contains the gcode, now upload it
        self._stage = OutputStage.uploading
        self._stream.seek(0)

        # set up a multi-part post
        self._multipart = QtNetwork.QHttpMultiPart(
            QtNetwork.QHttpMultiPart.FormDataType)

        # add the file part
        part = QtNetwork.QHttpPart()
        part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                       'form-data; name="file"; filename="%s"' % fileName)
        part.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                       "application/octet-stream")
        part.setBody(self._stream.getvalue().encode())
        self._multipart.append(part)

        # send the post
        url = "http://" + self._address + "/print"
        Logger.log("d", url)

        self._request = QtNetwork.QNetworkRequest(QUrl(url))
        self._request.setRawHeader('User-agent'.encode(),
                                   'Cura WirelessPrinting Plugin'.encode())
        self._reply = self._qnam.post(self._request, self._multipart)

        # connect the reply signals
        self._reply.error.connect(self._onNetworkError)
        self._reply.uploadProgress.connect(self._onUploadProgress)
        self._reply.downloadProgress.connect(self._onDownloadProgress)
    def requestWrite(self, node, fileName=None, *args, **kwargs):
        if self._stage != OutputStage.ready:
            raise OutputDeviceError.DeviceBusyError()

        if fileName:
            fileName = os.path.splitext(fileName)[0] + '.gcode'
        else:
            fileName = "%s.gcode" % Application.getInstance(
            ).getPrintInformation().jobName
        self._fileName = fileName

        # create the temp file for the gcode
        self._stream = StringIO()
        self._stage = OutputStage.writing
        self.writeStarted.emit(self)

        # show a progress message
        message = Message(
            catalog.i18nc("@info:progress",
                          "Saving to <filename>{0}</filename>").format(
                              self.getName()), 0, False, -1)
        message.show()
        self._message = message

        # send all the gcode to self._stream
        gcode = getattr(Application.getInstance().getController().getScene(),
                        "gcode_list")
        lines = len(gcode)
        nextYield = time() + 0.05
        i = 0
        for line in gcode:
            i += 1
            self._stream.write(line)
            if time() > nextYield:
                self._onProgress(i / lines)
                QCoreApplication.processEvents()
                nextYield = time() + 0.05

        # self._stream now contains the gcode, now upload it
        self._stage = OutputStage.uploading
        self._stream.seek(0)

        # set up a multi-part post
        self._multipart = QtNetwork.QHttpMultiPart(
            QtNetwork.QHttpMultiPart.FormDataType)

        # add the file part
        part = QtNetwork.QHttpPart()
        part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                       'form-data; name="file"; filename="%s"' % fileName)
        part.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                       "application/octet-stream")
        part.setBody(self._stream.getvalue().encode())
        self._multipart.append(part)

        # send the post
        url = "http://" + self._address + "/print"
        Logger.log("d", url)

        self._update_timer.stop()

        ####################################################
        # This is working but ugly. Pull Requests welcome.

        fd = open('/tmp/' + fileName, "w")
        fd.write(self._stream.getvalue())
        fd.close()

        command = 'curl -F "file=@/tmp/' + fileName + '" ' + url
        Logger.log("d", command)

        import subprocess, shlex
        subprocess.Popen(shlex.split(command))

        self._stage = OutputStage.ready
        if self._message:
            self._message.hide()
        self._message = None
Пример #8
0
    def requestWrite(self, node, fileName=None, *args, **kwargs):
        if self._stage != OutputStage.ready:
            raise OutputDeviceError.DeviceBusyError()

        if fileName:
            fileName = os.path.splitext(fileName)[0] + '.gcode'
        else:
            fileName = "%s.gcode" % Application.getInstance(
            ).getPrintInformation().jobName
        self._fileName = fileName

        # create the temp file for the gcode
        self._stream = StringIO()
        self._stage = OutputStage.writing
        self.writeStarted.emit(self)

        # show a progress message
        message = Message(
            catalog.i18nc("@info:progress",
                          "Saving to <filename>{0}</filename>").format(
                              self.getName()), 0, False, -1)
        message.show()
        self._message = message

        # find the G-code for the active build plate to print
        active_build_plate_id = Application.getInstance().getBuildPlateModel(
        ).activeBuildPlate
        gcode_dict = getattr(
            Application.getInstance().getController().getScene(), "gcode_dict")
        gcode = gcode_dict[active_build_plate_id]

        # send all the gcode to self._stream
        lines = len(gcode)
        nextYield = time() + 0.05
        i = 0
        for line in gcode:
            i += 1
            self._stream.write(line)
            if time() > nextYield:
                self._onProgress(i / lines)
                QCoreApplication.processEvents()
                nextYield = time() + 0.05

        # self._stream now contains the gcode, now upload it
        self._stage = OutputStage.uploading
        self._stream.seek(0)

        # set up a multi-part post
        self._multipart = QtNetwork.QHttpMultiPart(
            QtNetwork.QHttpMultiPart.FormDataType)

        # add the form variables
        formvalues = {'select': 'false', 'print': 'false'}
        for key, value in formvalues.items():
            part = QtNetwork.QHttpPart()
            part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                           'form-data; name="%s"' % key)
            part.setBody(value.encode())
            self._multipart.append(part)

        # add the file part
        part = QtNetwork.QHttpPart()
        part.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
                       'form-data; name="file"; filename="%s"' % fileName)
        part.setBody(self._stream.getvalue().encode())
        self._multipart.append(part)

        # send the post
        self._request = QtNetwork.QNetworkRequest(
            QUrl(self._host + "/api/files/local"))
        self._request.setRawHeader(
            'User-agent'.encode(),
            'Cura OctoPrintOutputDevice Plugin'.encode())
        self._request.setRawHeader('X-Api-Key'.encode(), self._apiKey.encode())
        self._reply = self._qnam.post(self._request, self._multipart)

        # connect the reply signals
        self._reply.error.connect(self._onNetworkError)
        self._reply.uploadProgress.connect(self._onUploadProgress)
        self._reply.downloadProgress.connect(self._onDownloadProgress)