QT窗体用QHttpMultiPart上传文件到PHP接口

最近要写一个qt窗体程序上传文件到web服务器,网上看了很多例子,基本都是只有qt的代码(还不齐全),无web API接口代码,经过测试和修改,最终代码如下(分为qt和PHP 接口)

QT代码:

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
    
public:    
    Widget(QWidget *parent = nullptr);
    QNetworkReply *reply;
    ~Widget();

private slots:
    void uploadFinished();
    void on_pushButton_upload_released();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

Widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::on_pushButton_upload_released()
{
    QString  url_ ="http://localhost/uptest/upfile.php";
    QString uploadFilename="D:/a.html";//上传路径,可自定义

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QHttpPart imagePart;
    QFile *file = new QFile(uploadFilename);
    file->open(QIODevice::ReadOnly);
    imagePart.setBodyDevice(file);
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/html"));//设置上传文件类型
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + file->fileName() + "\""));
    multiPart->append(imagePart);

    QHttpPart dataPart;
    //在body体中设置值,在这里是999
    dataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"sn\""));
    dataPart.setBody("999");
    multiPart->append(dataPart);

    QUrl url(url_);
    QNetworkRequest request(url);

    QNetworkAccessManager *networkManager= new QNetworkAccessManager;
    reply = networkManager->post(request, multiPart);
    multiPart->setParent(reply);

	//关联槽,上传完成后输出返回信息
    connect(reply,SIGNAL(finished()),this,SLOT(uploadFinished()));
}

void Widget::uploadFinished()
{
    // 获取数据
    if (QNetworkReply::NoError == reply->error()){
        QByteArray context = reply->readAll();
        //QTextCodec* pCodec = QTextCodec::codecForName("UTF-8");
        //QString strResult = pCodec->toUnicode(context);//输出返回的文本

        QJsonObject result_obj = QJsonDocument::fromJson(context).object();
        int code = result_obj.value("code").toInt();
        qDebug()<<"code:"<<code<<result_obj;
    }
    else{
        qDebug()<<"error string:"<<reply->errorString();
        reply->deleteLater();
    }
}

http服务端 web API 接口php代码(只实现了文件接收和转存)

upfile.php

<?php
 $sn = $_POST["sn"]; //获取传过来的body参数sn
 $fileName = $_FILES["file"]["name"] . $sn;
//end
 $path = "upload";//转存目录
 if (!is_dir($path)) { //不存在目录则创建,windows,linux通用
    mkdir($path, 0777, true);
    chmod($path, 0777);
 }
 $fileName = $path . "/" . $sn . "_" . $fileName;
 //转存文件
 move_uploaded_file(iconv("UTF-8", "GBK", $_FILES["file"]["tmp_name"]), iconv("UTF-8", "GBK", $fileName));
echo '{"code":1}';//接口返回数据
?>

你可能感兴趣的:(QT上位机软件,C++)