Qt Http QHttpMultiPart上传文件到java http服务器

2 篇文章 0 订阅

                         Qt Http QHttpMultiPart上传文件到java http服务器

1.最近项目用到了Qt上传文件到HTTP服务器,由于之前做过一个http接收文件的服务器,所以直接拿来调试。由于对http的了解一个不够深入,调试了许久都没有成功上传文件到服务器。之前是写的服务器一直是用网页的方式和postman来模仿post文件。

由于找不到失败的原因,所以直接用wareshark来抓包看一下Qt post的数据和网页上传有什么区别。在第4.节图中给出了网页上传文件时wareshark抓取到的数据包。

2.经过调试后可用的Qt  代码,由于我的http是在多线程中使用,所以在此处加入了一个QEventLoop来同步等待返回上传结果。

void HttpObject::uploadFile()
{
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QString path = QString("/home/maowendi/Desktop/image.jpg");
    QHttpPart imagePart;
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"image.jpg\""));
    imgFile = new QFile(path);
    imgFile->open(QIODevice::ReadOnly);
    imagePart.setBodyDevice(file);
    imgFile->setParent(multiPart); 
    multiPart->append(imagePart);
    QUrl url("http://172.20.149.148:8089/upload-file");
    QNetworkRequest request(url);

    uploadFileReply = m_httpNAM->post(request, multiPart);
    multiPart->setParent(uploadFileReply); 
    connect(uploadFileReply,SIGNAL(finished()),this,SLOT(httpUploadFinished()));
    QEventLoop eventLoop;
    connect(m_httpNAM, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
    eventLoop.exec();       
}

void HttpObject::httpUploadFinished()  
{
   if(uploadFileReply->error() == QNetworkReply::NoError) {
    qDebug()<<"upload file finished";
    imgFile->flush();
    imgFile->close();
    uploadFileReply->deleteLater();
    uploadFileReply = NULL;
    delete imgFile;
    imgFile = NULL;
   }
   else
   {
        qDebug()<<"error string:"<<uploadFileReply->errorString();
        uploadFileReply->deleteLater();
   }

}

 

3.Qt官方例程的代码如下,根据官方例程还是要做一点修改才能成功上传文件的。

其中红色框部分根据我自己的java服务器测试抓包数据进行了修改。见下图

4.抓包工具Wareshark,抓取数据包如下

5.结果执行代码后服务器返回成功

6.Java服务器处理接收文件代码

   /**
     * 上传单个文件`      1
     *
     * @param file 上传文件 MultipartFile 的对象
     * @return 上传的结果
     */
    @RequestMapping(value = "/upload-file", method = RequestMethod.POST)
    @ResponseBody
    public String uploadFile(HttpServletRequest request,@RequestParam("file") MultipartFile file) {
        saveFile(file);
        System.out.println(filePath);

        ReturnWeb ret = new ReturnWeb();
        ret.setCode(1);
        ret.setCount(0);
        ret.setMsg("Success");
        JSONObject jsonS = (JSONObject) JSON.toJSON(ret);
        return jsonS.toString();
    }
  /**
     * 把 HTTP 请求中的文件流保存到本地
     *
     * @param file MultipartFile 的对象
     */
    private boolean saveFile(MultipartFile file) {
        if (!file.isEmpty()) {
            try {
                // getRealPath() 取得 WEB-INF 所在文件夹路径
                // 如果参数是 "/temp", 当 temp 存在时返回 temp 的本地路径, 不存在时返回 null/temp (无效路径)
                //String path ="D:\\IDEAPro\\File"+ File.separator + file.getOriginalFilename();;
                String path =servletContext.getRealPath("") + File.separator + file.getOriginalFilename();
                FileCopyUtils.copy(file.getInputStream(), new FileOutputStream(path));
                fileName = file.getOriginalFilename();
                filePath = "http://172.20.149.148:8089/"+fileName;
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

 

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
您可以使用Qt提供的QNetworkAccessManager类来进行HTTP请求,然后使用Java提供的HTTP接口上传文件服务器。以下是一个示例代码,仅供参考: ```cpp QUrl url("http://example.com/upload"); QFile file("/path/to/file"); if (!file.open(QIODevice::ReadOnly)) { // 文件打开失败 return; } QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data"); QHttpMultiPart *multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + file.fileName() + "\"")); filePart.setBodyDevice(&file); file.setParent(multipart); multipart->append(filePart); QNetworkAccessManager manager; QNetworkReply *reply = manager.post(request, multipart); multipart->setParent(reply); // 确保在reply完成后multipart会被删除 // 处理reply的结果 connect(reply, &QNetworkReply::finished, this, [reply]() { if (reply->error() != QNetworkReply::NoError) { // 请求失败 return; } QByteArray data = reply->readAll(); // 处理服务器返回的数据 }); ``` 在Java端,您需要根据接口要求解析HTTP请求的body中的文件数据,并将其存储到服务器本地。以下是一个Java的示例代码,仅供参考: ```java @PostMapping("/upload") public String handleUpload(@RequestParam("file") MultipartFile file) { // 检查文件类型、大小等信息 if (!file.getContentType().startsWith("image/") || file.getSize() > MAX_SIZE) { return "error"; } // 保存文件到服务器本地 try (InputStream inputStream = file.getInputStream(); FileOutputStream outputStream = new FileOutputStream("/path/to/upload/" + file.getOriginalFilename())) { byte[] buffer = new byte[4096]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } } catch (IOException e) { return "error"; } return "ok"; } ``` 注意:以上代码仅供参考,实际使用时需要根据接口要求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值