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
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
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)
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
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
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)