从URL下载/流文件-asp.net

我需要流式传输文件,这将导致在浏览器中保存为提示。问题是,该文件所在的目录已虚拟映射,因此我无法使用Server.MapPath确定其实际位置。该目录与网站不在同一位置(甚至不在实时服务器上)。

我想要类似以下的内容,但这将允许我传递Web URL,而不是服务器文件路径。

我可能最终不得不从配置基本路径构建我的文件路径,然后追加到路径的其余部分,但是希望我可以用这种方式来代替。

var filePath = Server.MapPath(DOCUMENT_PATH);

if (!File.Exists(filePath))

return;

var fileInfo = new System.IO.FileInfo(filePath);

Response.ContentType = "application/octet-stream";

Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath));

Response.AddHeader("Content-Length", fileInfo.Length.ToString());

Response.WriteFile(filePath);

Response.End();

回答:

您可以使用HttpWebRequest获取文件并将其流回客户端。这使您可以获取带有URL的文件。我发现的一个示例(但不记得该在哪里归功)是

    //Create a stream for the file

Stream stream = null;

//This controls how many bytes to read at a time and send to the client

int bytesToRead = 10000;

// Buffer to read bytes in chunk size specified above

byte[] buffer = new Byte[bytesToRead];

// The number of bytes read

try

{

//Create a WebRequest to get the file

HttpWebRequest fileReq = (HttpWebRequest) HttpWebRequest.Create(url);

//Create a response for this request

HttpWebResponse fileResp = (HttpWebResponse) fileReq.GetResponse();

if (fileReq.ContentLength > 0)

fileResp.ContentLength = fileReq.ContentLength;

//Get the Stream returned from the response

stream = fileResp.GetResponseStream();

// prepare the response to the client. resp is the client Response

var resp = HttpContext.Current.Response;

//Indicate the type of data being sent

resp.ContentType = "application/octet-stream";

//Name the file

resp.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());

int length;

do

{

// Verify that the client is connected.

if (resp.IsClientConnected)

{

// Read data into the buffer.

length = stream.Read(buffer, 0, bytesToRead);

// and write it out to the response's output stream

resp.OutputStream.Write(buffer, 0, length);

// Flush the data

resp.Flush();

//Clear the buffer

buffer = new Byte[bytesToRead];

}

else

{

// cancel the download if client has disconnected

length = -1;

}

} while (length > 0); //Repeat until no data is read

}

finally

{

if (stream != null)

{

//Close the input stream

stream.Close();

}

}

以上是 从URL下载/流文件-asp.net 的全部内容, 来源链接: utcz.com/qa/406254.html

回到顶部