C++ Go http:从Qt客户端发送图像后没有这样的文件

C++ Go http:从Qt客户端发送图像后没有这样的文件,c++,qt,go,multipartform-data,C++,Qt,Go,Multipartform Data,我有一个Go API,它可以保存客户端发送的图像。我知道当POST请求来自HTML表单时,Go代码可以工作。 但是,当从QT+C++客户端发送多部分POST请求时,服务器返回错误 http:没有这样的文件 在客户端,我有一个QPixmap,我将其转换为QByteArray,然后发送,但不知怎的,我从Go得到了这个错误。我知道当我删除时,客户端发送的数据长度会减少 multi_part->append(image_part); 因此应该发送QPixmap Go代码: func apiUpl

我有一个Go API,它可以保存客户端发送的图像。我知道当POST请求来自HTML表单时,Go代码可以工作。 但是,当从QT+C++客户端发送多部分POST请求时,服务器返回错误

http:没有这样的文件

在客户端,我有一个QPixmap,我将其转换为QByteArray,然后发送,但不知怎的,我从Go得到了这个错误。我知道当我删除时,客户端发送的数据长度会减少

multi_part->append(image_part);
因此应该发送QPixmap

Go代码:

func apiUploadHandler(w http.ResponseWriter, req *http.Request) {
if req.Method == "POST" {
    req.ParseMultipartForm(0)
    fmt.Printf("%v %v %v", req.RemoteAddr, req.ContentLength, req.Body)
    file, fileheader, err := req.FormFile("image")
    if err != nil {
        cio.PrintMessage(1, err.Error())
        return
    }
    defer file.Close()
    var id string
    created := false
    for created != true {
        id = generateImageID()
        err = db.CheckIfImageIDInUse(id)
        if err != nil {
            if err.Error() == "Image ID '"+id+"' exists.'" {
                created = false
                continue
            } else {
                created = false
                cio.PrintMessage(1, err.Error())
                return
            }
        }
        created = true
    }
    filePath := fsys.ImgStoragePath + id + "." + strings.Split(fileheader.Filename, ".")[1]
    err = db.StoreImage(id, strings.Split(fileheader.Filename, ".")[0] /*image name*/, filePath, strings.Split(fileheader.Filename, ".")[1] /*extension*/)
    if err != nil {
        cio.PrintMessage(1, err.Error())
        return
    }
    bytesCopied, err := fsys.StoreImage(filePath, file)
    if err != nil {
        cio.PrintMessage(1, err.Error())
        return
    }
    cio.PrintMessage(0, "File "+filePath+" has been created.")
    if err != nil {
        cio.PrintMessage(1, err.Error())
        return
    }
    cio.PrintMessage(0, "Content of uploaded image ("+strconv.FormatInt(bytesCopied, 10)+" Bytes) has been copied to "+filePath+".")
    http.Redirect(w, req, "/"+id, http.StatusFound)
}

}
C++客户端代码:

void Share::upload(const QByteArray &data) {
    QHttpMultiPart *multi_part = new          QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart text_part;
    text_part.setHeader(QNetworkRequest::ContentDispositionHeader,   QVariant("form-data; name=\"text\"\""));
    text_part.setBody("Screenshot.png");
    QHttpPart image_part;
    image_part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
    image_part.setHeader(QNetworkRequest::ContentDispositionHeader,  QVariant("form-data; name=\"image\""));
    image_part.setBody(data);
    multi_part->append(text_part);
    multi_part->append(image_part);
    QNetworkRequest request(QUrl("http://localhost:8000/api/upload"));
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    connect(manager, SIGNAL(finished(QNetworkReply *)), this,    SLOT(reply_finished(QNetworkReply *)));
    manager->post(request, multi_part);
    qDebug() << QString(data);
}
void Share::上传(常量QByteArray和数据){
QHttpMultiPart*multi_part=新的QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart文本部分;
text_part.setHeader(QNetworkRequest::ContentDispositionHeader,Qvariation(“表单数据;name=\”text\“\”);
text_part.setBody(“Screenshot.png”);
QHttpPart图像_部分;
image_part.setHeader(QNetworkRequest::ContentTypeHeader,QVariant(“image/png”);
image\u part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“图像”));
图像_零件立根体(数据);
多部分->附加(文本部分);
多零件->附加(图像零件);
QNetworkRequest请求(QUrl(“http://localhost:8000/api/upload"));
QNetworkAccessManager*manager=新的QNetworkAccessManager();
连接(管理器,信号(已完成(QNetworkReply*)),此插槽(已完成(QNetworkReply*));
经理->职位(请求,多个部分);

qDebug()我不确定,但您可以尝试更改

image_part.setHeader(QNetworkRequest::ContentDispositionHeader,  QVariant("form-data; name=\"image\""));
差不多

image_part.setHeader(QNetworkRequest::ContentDispositionHeader,  QVariant("form-data; name=\"image\"; filename=\"Screenshot.png\""));

我不知道该说什么。这确实有效。我只是添加了文件名,没有做任何其他事情,现在它有效了。非常感谢!