def generate_multipart_data(text_dict=None, file_dict=None): multipart_data = QHttpMultiPart(QHttpMultiPart.FormDataType) if text_dict: for key, value in text_dict.items(): text_part = QHttpPart() text_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data;name=\"%s\"" % key) text_part.setBody(str(value).encode("utf-8")) multipart_data.append(text_part) if file_dict: for key, file in file_dict.items(): file_part = QHttpPart() filename = QFileInfo(file.fileName()).fileName() file_part.setHeader( QNetworkRequest.ContentDispositionHeader, "form-data; name=\"%s\"; filename=\"%s\"" % (key, filename)) file_part.setBodyDevice(file) file.setParent(multipart_data) multipart_data.append(file_part) return multipart_data
def genReqStr(value: Dict[str, Any], prefix="", multiPart=None) -> QHttpMultiPart: if not multiPart: multiPart = QHttpMultiPart(QHttpMultiPart.FormDataType) if isinstance( value, (QtCore.QFile, io.BufferedReader)): # file content must be a QFile object # FIXME: This is broken. IoBufferedReader will be read to memory entirely - not streamed!! if "name" in dir(value): fileName = value.name elif "fileName" in dir(value): fileName = value.fileName() try: mimetype, encoding = mimetypes.guess_type(fileName, strict=False) mimetype = mimetype or "application/octet-stream" except: mimetype = "application/octet-stream" filePart = QHttpPart() filePart.setHeader(QNetworkRequest.ContentTypeHeader, mimetype) filePart.setHeader( QNetworkRequest.ContentDispositionHeader, 'form-data; name="{0}"; filename="{1}"'.format( prefix, os.path.basename(fileName))) if isinstance(value, io.BufferedReader): filePart.setBody(value.read()) else: filePart.setBodyDevice(value) value.setParent(multiPart) multiPart.append(filePart) elif isinstance(value, list): if not value: otherPart = QHttpPart() otherPart.setHeader(QNetworkRequest.ContentTypeHeader, "application/octet-stream") otherPart.setHeader(QNetworkRequest.ContentDispositionHeader, 'form-data; name="{0}"'.format(prefix)) otherPart.setBody(b"") multiPart.append(otherPart) elif any([isinstance(x, dict) for x in value]): for idx, v in enumerate(value): NetworkService.genReqStr( v, (prefix + "." if prefix else "") + str(idx), multiPart) else: for val in value: logger.debug("serializing param item %r of list value %r", val, prefix) textPart = QHttpPart() textPart.setHeader(QNetworkRequest.ContentTypeHeader, "application/octet-stream") textPart.setHeader( QNetworkRequest.ContentDispositionHeader, 'form-data; name="{0}"'.format(prefix)) textPart.setBody(str(val).encode("utf-8")) multiPart.append(textPart) elif isinstance(value, dict): if prefix: prefix += "." for k, v in value.items(): NetworkService.genReqStr(v, prefix + k, multiPart) #elif value is None: #return multiPart else: if value is None: value = "" otherPart = QHttpPart() otherPart.setHeader(QNetworkRequest.ContentTypeHeader, "application/octet-stream") otherPart.setHeader(QNetworkRequest.ContentDispositionHeader, 'form-data; name="{0}"'.format(prefix)) otherPart.setBody(str(value).encode("utf-8")) multiPart.append(otherPart) return multiPart