- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在一个项目中创建一个卖家应用程序,卖家可以在其中上传菜单图片和一些附加信息,例如价格和菜单名称。但我坚持使用 POST 请求方法,因为这次我必须上传带有一些文本数据的图像,而不仅仅是文本数据。
我正在使用 PyQt5。
这是我的 API Web 服务器。我正在使用 Django Rest Framework 来构建它。
[
这是菜单模型:
class Menu(models.Model):
image = models.ImageField(upload_to=path_and_rename)
name = models.CharField(max_length=100)
price = models.IntegerField()
category = models.IntegerField()
availability = models.BooleanField(default=False)
# booked = models.IntegerField()
sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)
这是菜单序列化器:
class MenuSerializer(serializers.ModelSerializer):
class Meta:
model = models.Menu
fields = ('id', 'image', 'name', 'price',
'category','availability', 'sellerID')
这是菜单 View 集:
class MenuViewset(viewsets.ModelViewSet):
queryset = models.Menu.objects.all()
serializer_class = serializers.MenuSerializer
我尝试过这个答案中的方法:here
这是我对该方法的实现:
def upload(self):
file1 = QFile("/home/shalahuddin/Desktop/jamu.jpg")
file1.open(QFile.ReadOnly)
url = "http://127.0.0.1:8000/api/menu/"
nama = QByteArray()
nama.append("ABCD")
harga = QByteArray()
harga.append(str(999))
kategori = QByteArray()
kategori.append(str(0))
ada = QByteArray()
ada.append(str(True))
idseller = QByteArray()
idseller.append(str(2))
data = {"name": nama, "price": harga, "category": kategori, "availability": ada, "sellerID": idseller}
files = {"image": file1}
multipart = self.construct_multipart(data, files)
request_qt = QNetworkRequest(QUrl(url))
request_qt.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
'multipart/form-data; boundary=%s' % multipart.boundary())
self.manager = QtNetwork.QNetworkAccessManager()
self.manager.finished.connect(self.handleResponseMenu)
self.manager.post(request_qt, multipart)
def handleResponseMenu(self, reply):
er = reply.error()
data = json.loads(str(reply.readAll(), 'utf-8'))
file = open("/home/shalahuddin/Desktop/testfile.txt", "w")
file.write(str(reply))
if er == QtNetwork.QNetworkReply.NoError:
bytes_string = reply.readAll()
data = json.loads(str(bytes_string, 'utf-8'))
# print(data)
QMessageBox.information(self, "Menu", "Upload Success!")
else:
errorMessage = "Error occured: " + str(er) + "\n" + str(reply.errorString())
QMessageBox.critical(self, "Error Done", errorMessage)
def construct_multipart(self, data, files):
multiPart = QHttpMultiPart(QHttpMultiPart.FormDataType)
for key, value in data.items():
textPart = QtNetwork.QHttpPart()
textPart.setHeader(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 = 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
但结果是我收到错误 302 Bad Request。我得到的 JSON 数据是:
{
'image': ['No file was submitted.'],
'name': ['Ensure this field has no more than 100 characters.',
'Null characters are not allowed.'],
'price': ['This field is required.'],
'category': ['This field is required.'],
'sellerID': ['This field is required.']
}
所以我想知道问题出在哪里?我曾多次尝试追踪,但仍然没有给出答案。这是我第一次使用多部分请求。
最佳答案
在下面的示例中,我将向您展示如何创建查询:
import json
from PyQt5 import QtCore, QtNetwork, QtWidgets
class MenuWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MenuWidget, self).__init__(parent)
self._manager = QtNetwork.QNetworkAccessManager()
self._manager.finished.connect(self.handleResults)
self.init_ui()
def init_ui(self):
self.filepath_lineedit = QtWidgets.QLineEdit()
select_button = QtWidgets.QPushButton(
text="Select File",
clicked=self.select_file
)
self.name_lineedit = QtWidgets.QLineEdit()
self.price_spinbox = QtWidgets.QSpinBox()
self.category_spinbox = QtWidgets.QSpinBox()
self.availability_checkbox = QtWidgets.QCheckBox()
self.seller_id_spinbox = QtWidgets.QSpinBox()
self.log_textedit = QtWidgets.QTextBrowser()
upload_button = QtWidgets.QPushButton(
text="Upload",
clicked=self.upload
)
hlay = QtWidgets.QHBoxLayout()
hlay.addWidget(self.filepath_lineedit)
hlay.addWidget(select_button)
lay = QtWidgets.QFormLayout(self)
lay.addRow("Image:", hlay)
lay.addRow("Name:", self.name_lineedit)
lay.addRow("Price:", self.price_spinbox)
lay.addRow("Category:", self.category_spinbox)
lay.addRow("Availability:", self.availability_checkbox)
lay.addRow("SellerID:", self.seller_id_spinbox)
lay.addRow(self.log_textedit)
lay.addRow(upload_button)
@QtCore.pyqtSlot()
def select_file(self):
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
"Open Image",
QtCore.QDir.currentPath(),
"Image Files (*.png *.jpg *.bmp)"
)
if filename:
self.filepath_lineedit.setText(filename)
@QtCore.pyqtSlot()
def upload(self):
data = {
"name": self.name_lineedit.text(),
"price": self.price_spinbox.value(),
"category": self.category_spinbox.value(),
"availability": self.availability_checkbox.isChecked(),
"sellerID": self.seller_id_spinbox.value()
}
path = self.filepath_lineedit.text()
files = {"image": path}
multi_part = self.construct_multipart(data, files)
if multi_part:
url = QtCore.QUrl("http://127.0.0.1:8000/api/menu/")
request = QtNetwork.QNetworkRequest(url)
reply = self._manager.post(request, multi_part)
multi_part.setParent(reply)
@QtCore.pyqtSlot(QtNetwork.QNetworkReply)
def handleResults(self, reply):
parsed = json.loads(reply.readAll().data())
text = json.dumps(parsed, indent=4, sort_keys=True)
self.log_textedit.setText(text)
if reply.error() == QtNetwork.QNetworkReply.NoError:
QtWidgets.QMessageBox.information(self, "Menu", "Upload Success!")
else:
errorMessage = "Error occured: {}".format(reply.errorString())
QMessageBox.critical(self, "Error Done", errorMessage)
reply.deleteLater()
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():
file = QtCore.QFile(filepath)
if not file.open(QtCore.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)
return multi_part
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MenuWidget()
w.show()
sys.exit(app.exec_())
关于python - PyQt5 和 Django : How to Upload Image using HTTP Request ( Multipart-form )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55129643/
我在项目中使用ngx-uploader实现文件上传。 但是当我上传多个文件时,它将文件数组分成多个请求。 我尝试使用 ng2-file-upload 但结果相同。 最佳答案 请参阅 GitHub 上的
我想要一个类似 this 的上传者但我想要一个进度条,并在完成后通过电子邮件向我发送通知,就像 yousendit 那样。 任何开源的东西都会很酷。 最佳答案 Uploadify允许有进度条。至于电子
我正在尝试编写一个Python脚本,可以将图片和pdf上传到WordPress。我希望图像上传到文件夹‘/wp-Content/Uploads/’,将pdf文件上传到文件夹‘/wp-Content/U
开发自定义 portlet 以在 Liferay 6.2 中上传多个文件。 在以下位置的文档库 Portlet 中浏览 Liferay 源代码时找到 Liferay.Upload 组件: https:
我正在尝试使用 HTML5 制作一个带有进度表的文件 uploader 。这是我的代码: Test Progress Meter function submit
当我选择一些图像并放入 WordPress 文件 uploader 时,该组的第一张图像此时似乎已正确上传,而其他图像则卡住且未得到处理。 但是,经过一段时间的等待,我停止了该进程,重新加载了浏览器选
我今天刚刚从 Cordova (PhoneGap) 1.5 升级到 1.9,突然我的 FileTransfer 参数停止发布。我可以说出来,因为我让服务器端调试了 $_POST 参数,它们现在是空白的
我已经在运行 RHEL7 的服务器上安装了 Mediawiki v1.24.1。 我已经将它安装在/var/www/foohelp/wiki 下。但是,当我尝试上传文件时,出现以下错误: [f3eae
在 Symfony2 中上传图片时,有没有办法调整图片大小? ImagineAvalancheBundle只允许在检索图像时将图像大小调整为缩略图,这对我来说并不是真正的性能。 此外,在发布数据时检索
我在网站上使用blueimp-file-upload,并且在使用webpack来组织我的js代码。 我从NPM安装了blueimp-file-upload和jquery.ui.widget npm i
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我需要获取上传的文件以将其推送到文件列表,但我无法做到这一点...我希望有人可以帮助我: UIkit.upload('.test-upload', { url: `/api/gridfs/${d
我基本上是一名 Java 开发人员,仅了解有关 Android 开发的基本信息。我开发了一个 Web 端点,它接受文件和一些其他参数。 java代码是 @RequestMapping(path = "
我正在使用 symfony.com 的食谱文章来实现图像的文件上传选项。 现在我想将其他图像加载到实体中。 默认的编辑策略是: 1.从数据库中取出 2. 注入(inject)表单 3.坚持 不知何故,
我需要处理通过(有和没有分块)上传到 Amazon S3 的每个文件的二进制数据。你知道 Fineuploader 中是否有我可以用来处理每个二进制 block /文件的函数/信号吗?: 例如: pr
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我读到 HTML5 规范引入了在上传表单中选择多个文件的功能。目前有哪些浏览器支持这个? Adobe AIR 是否支持它? 额外的问题:是否有利用此功能的 JavaScript 库? 最佳答案 即将发
我正在评估 Fine Uploader与其他各种选项相比,特别是 JQuery File Upload . 与依赖 Bootstrap 和 JQuery UI 的 JQuery File Upload
我正在尝试通过 Swift 2/Alamofire 将文件和参数上传到 Google 云端硬盘。在下面的代码中,我更改了以下行: "https://www.googleapis.com/upload/
我正在使用 Kendo UI Upload Control 并希望在同步模式下允许多个文件,但是当同时添加多个文件时,它们被组合在同一行项目中。有没有办法在组选择时将每个单独的文件作为自己的行项目?在
我是一名优秀的程序员,十分优秀!