Tomcat配置Http下載服務器,MFC下載文件

http://tomcat.apache.org/下載Tomcat,下載JDK,JRE,配置開發環境,但是在cmd中進入Tomcat目錄bin目錄,雖然我的環境變量都配置正確了,但執行service.bat install Tomcat的時候報錯

The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE

看了下service.bat文件,就是沒有找到這個環境變量。但看到裏面引用了setclasspath.bat,所以手動修改了下發現可以了。方法如下:打開bin下面的setclasspath.bat,大概在第22行處手動設置

rem ---------------------------------------------------------------------------
rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
rem are valid and consistent with the selected start-up options and set up the
rem endorsed directory.
rem ---------------------------------------------------------------------------
set JAVA_HOME=H:\Java\jdk1.8.0_91
set JRE_HOME=H:\Java\jre

rem Make sure prerequisite environment variables are set

rem In debug mode we need a real JDK (JAVA_HOME)
if ""%1"" == ""debug"" goto needJavaHome

rem Otherwise either JRE or JDK are fine
if not "%JRE_HOME%" == "" goto gotJreHome
if not "%JAVA_HOME%" == "" goto gotJavaHome
echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
 

上面紅色部分就是自己手動添加的

啓動後打開tomcat8w.exe啓動服務,打開localhost:8080,若跳出主頁界面,則說明運行成功,若失敗了則先手動運行shutdown.bat,然後再運行startup.bat。

啓動成功後,修改配置文件

 

1、在tomcat 安裝目錄\conf\Catalina\localhost下建立任意文件名xml文件,比如:download.xml,docBase後即爲http下載服務器的路徑

內容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context  reloadable="true" docBase="D://download" crossContext="true">

</Context>

 

 

2、配置web.xml(tomcat的配置文件),修改如下配置:

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

要將紅色的false改爲true。

3、重啓tomcat。

此時在瀏覽器中運行http://localhost:8080/download/就可以看到D:\download下的文件,此時就可以用http下載的方式下載文件。

============================================================

示例代碼如下:

#include <Windows.h>
#include <iostream>
#include<urlmon.h>
#pragma comment(lib,"urlmon.lib")
using namespace std;
class DownloadProgress : public IBindStatusCallback {
public:
	HRESULT __stdcall QueryInterface(const IID &, void **) {
		return E_NOINTERFACE;
	}
	ULONG STDMETHODCALLTYPE AddRef(void) {
		return 1;
	}
	ULONG STDMETHODCALLTYPE Release(void) {
		return 1;
	}
	HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib) {
		return E_NOTIMPL;
	}
	virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority) {
		return E_NOTIMPL;
	}
	virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved) {
		return S_OK;
	}
	virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError) {
		return E_NOTIMPL;
	}
	virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo) {
		return E_NOTIMPL;
	}
	virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) {
		return E_NOTIMPL;
	}
	virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk) {
		return E_NOTIMPL;
	}

	virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
	{
		if (ulProgressMax != 0)
		{
			double *percentage = new double(ulProgress * 1.0 / ulProgressMax * 100);
			//將percentage 發送給顯示
			cout << *percentage << endl;
			
			delete percentage;
		}
		return S_OK;
	}
};

int main()
{
	DownloadProgress progress;
	IBindStatusCallback* callback = (IBindStatusCallback*)&progress;
	HRESULT hr = URLDownloadToFileA(NULL,
		"http://localhost:8080/download/compare.exe", 
		"F:\\compare.exe",
		0, 
		static_cast<IBindStatusCallback*>(&progress));
	if (hr == S_OK)
		cout << "Download ok" << endl;
	else
	{
		cout << "Download Error" << endl;
	}

	
	system("pause");
}

其中URLDownloadToFileA的第五個參數,是爲了響應下載進度

的。若不需要可置空。

另外還有一個問題就是UrlDownloadToFile會先檢查緩存,如果緩存裏有,則不重新下載了。所以當服務器上的文件更改後,下載的還是原來的文件,要避免這種情況就要在下載之前刪除掉緩存

#include <wininet.h>
#pragma comment(lib,"urlmon.lib")
#pragma comment(lib, "wininet.lib")

DeleteUrlCacheEntry("http://localhost:8080/download/compare.exe");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章