/// <summary> /// 指定远程地址和本地文件绝对路径将文件传输到远程计算机 /// </summary> /// <param name="filePath">本地文件的绝对路径</param> /// <param name="url">远程地址</param> /// <param name="listener">本次上传任务的监听器</param> /// <returns>返回0表示任务启动成功</returns> public int Upload(String filePath, String url, FileTransferListener listener) { int id = m_maxID++; m_runningWork.Add(id, filePath); m_listeners.Add(id, listener); Thread thread = new Thread(new ParameterizedThreadStart(MultithreadUploadWork)); thread.Name = "" + id; object[] obj = { id, url }; thread.Start(obj); return(0); }
/// <summary> /// 多线程文件上传方法 /// </summary> /// <param name="param">呼叫方法的参数,其实际值为{任务id,上传url}</param> public void MultithreadUploadWork(object param) { object[] obj = (object[])param; int id = (int)obj[0]; String url = (String)obj[1]; String filePath = m_runningWork[id]; FileTransferListener listener = m_listeners[id]; HttpWebRequest request = null; Stream reader = null; HttpWebResponse response = null; FileStream fs = null; try { fs = new FileStream(filePath, FileMode.Open); request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/octet-stream"; byte[] buffer = new byte[10240]; long currentLength = 0; long totalLength = fs.Length; request.ContentLength = totalLength; Stream writer = request.GetRequestStream(); while (true) { int len = fs.Read(buffer, 0, 10240); writer.Write(buffer, 0, len); if (listener != null) { listener.OnFileTransfer(id, totalLength, currentLength, 0, null); } currentLength += len; if (len <= 0) { break; } } writer.Close(); response = (HttpWebResponse)request.GetResponse(); reader = response.GetResponseStream(); long contentLength = response.ContentLength; byte[] recvDatas = new byte[contentLength]; reader.Read(recvDatas, 0, (int)contentLength); if (listener != null) { listener.OnFileTransfer(id, totalLength, currentLength, 0, null); } } catch (Exception ex) { if (listener != null) { listener.OnFileTransfer(id, 0, 0, 3, ex.Message); } } finally { if (fs != null) { fs.Dispose(); } if (response != null) { response.Close(); } if (reader != null) { reader.Close(); } } }