使用 Http Put 请求在 HLS 服务器上发送的某些文件被部分上传

如何解决使用 Http Put 请求在 HLS 服务器上发送的某些文件被部分上传

作为项目的一部分,我必须在 HLS 服务器上连续上传音频块。我可以使用以下代码在 C++ 中使用带有 wininet API 的 HTTP Put 方法成功上传块。

bool CHTTP::HttpPut(char *szFile,int fileType)
{   

    bool bErrorFlag = false;
    if(m_hInternet == NULL)
    {
        int retStatus = OpenHTTPSession();
        if(retStatus < 1)
        {
            return true;
        }
    }

    char szPostURL[256];
    INTERNET_BUFFERS BufferIn = {0};
    DWORD dwBytesRead;
    DWORD dwBytesWritten;
    BYTE pBuffer[350000]; 
    BOOL bRead,bRet;
    static int flag = 1;
    BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );

    char szLocalFilePath[256];
    if(fileType == AUdio_CHUNK)
        sprintf(szLocalFilePath,"%s/%s",m_strFilePath,szFile);
    else
        strcpy(szLocalFilePath,szFile);

    int iFileSize = 0;

    if(fileType == AUdio_CHUNK)
    {
        strcpy(szPostURL,m_strPostPath);
        strcat(szPostURL,"/");
        strcat(szPostURL,szFile);
    }
    else if(fileType == M3U8)
        strcpy(szPostURL,m_szM3U8FiletoPost);
    else if(fileType == AUTO_M3U8)
        strcpy(szPostURL,m_szM3U8Autopost);

    DWORD dwFlags = 
        INTERNET_FLAG_KEEP_CONNECTION |
        INTERNET_FLAG_NO_COOKIES |
        INTERNET_FLAG_NO_CACHE_WRITE |
        INTERNET_FLAG_NO_UI |
        INTERNET_FLAG_RELOAD |INTERNET_FLAG_SECURE;

    m_hRequest = HttpOpenRequest(m_hHttpSession,(const char*)"PUT",szPostURL,"HTTP/1.1",NULL,(const char**)"*/*\0",dwFlags,1);

    if(m_hRequest==NULL) 
    {
        bErrorFlag = true;
        CloseHTTPSession();
        return bErrorFlag;
    }
    else
    {
        bErrorFlag = false;
    }

    int num_of_try = 0;
    while(num_of_try < 3)
    {
        char logDump[1000];
        num_of_try++;
        HANDLE hFile = CreateFile (szLocalFilePath,GENERIC_READ,FILE_SHARE_READ,OPEN_EXISTING,FILE_ATTRIBUTE_norMAL,NULL);
        if (hFile == INVALID_HANDLE_VALUE)
        {
            bErrorFlag = true;
            break;
        }
        else if(!m_bLogFlagCreateErr)
        {
            m_bLogFlagCreateErr = true;
            sprintf(logDump,"CreateFile success %s",szFile);
            WriteLog(mLogFile,logDump);
            bErrorFlag = false;
        }

        BufferIn.dwBufferTotal = GetFileSize (hFile,NULL);
        iFileSize = BufferIn.dwBufferTotal;
        if(!HttpSendRequestEx( m_hRequest,&BufferIn,HSR_INITIATE,0))
        {
            bErrorFlag = true;
            m_bLogFlagSend = false;
            sprintf(logDump,"Error on HttpSendRequestEx %lu %s",GetLastError(),logDump);

            break;
        }
        else
        {
            bErrorFlag = false;
            sprintf(logDump,"HttpSendRequest success %s",logDump);
        }
        DWORD sum = 0;
        int size = 0;
        do
        {
            bRead = ReadFile (hFile,pBuffer,iFileSize,&dwBytesRead,NULL);

            if(dwBytesRead != iFileSize)
            {
                sprintf(logDump,"dwBytesRead %d iFileSize %d %s",dwBytesRead,szFile);
                WriteLog(mLogFile,logDump);
            }

            if(dwBytesRead > 0)
            {
                bRet=InternetWriteFile( m_hRequest,&dwBytesWritten);

                while(dwBytesRead < dwBytesWritten && bRet)
                {
                    sprintf(logDump,"dwBytesRead %d dwBytesWritten %d %s",dwBytesWritten,szFile);
                    WriteLog(mLogFile,logDump);
                    bRet=InternetWriteFile( m_hRequest,pBuffer+dwBytesWritten,dwBytesRead - dwBytesWritten,&dwBytesWritten);
                }
                if(!bRet)
                {
                    int error = GetLastError();
                    sprintf(logDump,"InternetWriteFile %lu %s",error,logDump);
                    bErrorFlag = true;
                    break;
                }
                else 
                {
                    sprintf(logDump,"InternetWriteFile buffer success %s",logDump);
                    bErrorFlag = false;

                }
            }
        }
        while (dwBytesRead == iFileSize);
        CloseHandle (hFile);

        if(!HttpEndRequest(m_hRequest,0))
        {
            int error = GetLastError();
            if(error != 12032)
            {
                sprintf(logDump,"HttpEndRequest %lu %s",logDump)
                bErrorFlag = true;
                break;
            }
            else 
            {
                bErrorFlag = true;
                continue;
            }
        }
        else
        {

            sprintf(logDump,"HttpEndRequest success %s",logDump);

            DWORD dwCode,dwCodeSize; 
            dwCodeSize = sizeof(DWORD);
            if(!HttpQueryInfo(m_hRequest,HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,&dwCode,&dwCodeSize,NULL))
            {
                int error = GetLastError();
                char tmp[256];
                sprintf(tmp,"HttpQueryfails %d %s",tmp);

            }
            else
            {
                if(dwCode != 201 && dwCode != 204)
                {
                    char tmp[256];
                    sprintf(tmp,"dwcode %d is not 201 or 204 %s",dwCode,tmp);
                    bErrorFlag = true;
                    break;
                }

            }
            bErrorFlag = false;
            break;
        }
    }
    CloseHTTPSession();
    return bErrorFlag;
}

大多数情况下上传的块都是完整大小。如下图所示,随机上传到服务器的块不是完整大小。

sample image

在这种情况下,我没有收到任何错误消息,即使是 InternetWriteFile 函数返回的 dwBytesWritten 也是正确的。我无法理解我该怎么做才能解决它。感谢您在这方面的任何帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?