还是CGI下载问题,在提交WEB服务器时如何告知其文件名呢?

cooler 2000-03-19 01:24:00
我写了一个CGI下载程序
在写标准输出时使用的是:
content-type: application/octet-stream type=htm\n\n
然后写入文件的正文,现在文件是可以正常下载了,不过我在浏览器中接收到的
全是以我的CGI程序名为命名的文件,虽然其内容已经是正确的下载文件的内容了。

比如,我的CGI程序是:
http://localhosts/download?id=111
我在浏览器点击中将接收到一个名字是download的文件,虽然其内容是文件111的。
请问我应该怎样告知WEB服务器我提交的文件名呢?

又及:前面回答我的第一个CGI程序的朋友,谢谢你们的解答,
但不知什么原因,我无法连接到问题上(点击后的结果是出现一页登录页面,只有发表新文章还可以用),因此也就无法就你们的解答打分了。我现在已经与系统管理员联系了,一旦解决后我将马上给你们打分的。谢谢!








...全文
262 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cooler 2000-03-20
  • 打赏
  • 举报
回复
问题解决了!
我的开发环境是IE4加VB.后台服务器是WINDOWS98上的PERSONOL WEB SERVER(PWS)
看来就是环境的问题,所以我必须在MIME文件名信息前后加引号,如:
Send "content-type: application/octet-stream"
Send "Content-Disposition: filename=""" & Trim(fs.GetFileName(filename)) & """"
然后一切OK了.
另外在我上网查询的过程中,意外的发现了微软对IE中出现下载框处理的解释,大致是:
1.IE4对附件的内容会自动检测并调用相应的程序来处理,所以如果想使用上述办法来处理
HTML文件的下载的话只能说是不可能的.
2.微软承认这是IE4.01的一个BUG,并已经在IE5.0中改正过来了.
所以我的程序在IE4.0中点击的结果只是把内容SHOW出来,在IE5.0中就可以实现带文件名
的下载了.
再次感谢sunsetyang兄!!!













sunsetyang 2000-03-20
  • 打赏
  • 举报
回复
用这个替换你的那个Object吧!
Function ExtractFileName(PathName As String) As String
Dim X As Integer
For X = Len(PathName) To 1 Step -1
If Mid$(PathName, X, 1) = "\" Then Exit For
Next
ExtractFileName = Right$(PathName, Len(PathName) - X)
End Function
sunsetyang 2000-03-20
  • 打赏
  • 举报
回复
我看了一下程序,似乎运行的结果是你的程序的报错!而并不是浏览器报的错误,你查看一下运行时传送的参数Filename是不是正确的.即使filename不正确,浏览器也是能够正常工作的.你的程序除了异常,浏览器就不能正确工作了.fs.GetFileName(filename)的调用除了异常,你查一下,看那儿出的问题.
sunsetyang 2000-03-20
  • 打赏
  • 举报
回复
将你的content-type后面的那type去掉吧!新版的似乎没有那种格式了.
sunsetyang 2000-03-20
  • 打赏
  • 举报
回复
你的浏览器是什么的?ie?Netscape?版本呢?我的在Redhat 6.1的apache1.3.9下,ie4.0,netscape 4.6都工作正常.
你把两个合并一下:Content-Disposition: attachment;filename="&Trim(fs.GetFileName(filename))一下,然后再给我你的实际情况.你没有说明白你的开发情况,你是在Windows下开发cgi程序.用的什么服务程序?你的VB程序有没有问题?
cooler 2000-03-20
  • 打赏
  • 举报
回复
sunsetyang你好,我使用了你所说的Content-Disposition,但浏览器老是报错:

错误的文件名或数 ERROR NUMBER = 52


我的vb源代码如下:
Public Sub downloadbb(filename As String)
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Send "Status: 200 OK"
If Not fs.FileExists(filename) Then
SendHeader "文件访问错误"
Send filename & "文件不存在!"
SendFooter
Exit Sub
End If
Send "content-type: application/octet-stream type=htm"
Send "Content-Disposition: filename=" & Trim(fs.GetFileName(filename))
Send "Content-Disposition: attachment" & vbCrLf
'下面开始输出文件
.....
End Sub

Sub Send(s As String)
Dim rc As Long
Dim lBytesWritten As Long

s = s & vbCrLf
rc = WriteFile(hStdOut, s, countreallength(s), lBytesWritten, ByVal 0&)
End Sub
zdg 2000-03-19
  • 打赏
  • 举报
回复
你的上一道问题:
如何使用CGI来实现文件下载功能,急急!!(50)
不是已经给分了吗???
点击后的结果是出现一页登录页面是什么原因呢???
sunsetyang 2000-03-19
  • 打赏
  • 举报
回复
你可以在生成的头信息中加入一句location: xxxx,其中xxxx可以是绝对路径也可以是相对路径.即针对你的cgi,你可以给出相对于id=111的文件的相对于http服务的根目录的相对路径给出文件的具体名字.你试一下.
sunsetyang 2000-03-19
  • 打赏
  • 举报
回复
完整的实现:
...
printf("Content-Type: application/octet-stream\r\n");
printf("Content-Disposition: filename=filename.ext\r\n");
printf("Content-Disposition: attachment\r\n\r\n");
do
{
n=fread(buf,1,BUFFSIZE,fp);
fwrite(buf,1,n,stdout);
}while(n>0);
...
你的实现中,可以将filename.ext由你的id来指定.
注意:filename.ext中的指定不要包含目录信息,最好为文件名,如果包含目录信息,ie将废弃这个信息.
:-)
sunsetyang 2000-03-19
  • 打赏
  • 举报
回复
那我上面的那些你看了吗?那个应该是可以完成你的第一部分的对用户不可见的问题.
至于第二部分,由于浏览器的"智能"处理,似乎没有什么很好的办法.我在找一下有没有好的办法,再给你答复!
cooler 2000-03-19
  • 打赏
  • 举报
回复
使用location的确可以,但它同时要求:
1。指向的目录要求在web中开放
2。无法实现*.htm文件的下在,因为浏览器将把文件直接SHOW出来
而我现在要求对用户隐藏所有有关的下在信息,所以#¥%#%

sunsetyang 2000-03-19
  • 打赏
  • 举报
回复
呵呵,他的问题应该是由于账号闲置过久而引起的.
对不起,前面所讲的方法对于MIME类型未登记过的文件是无效的.只对于浏览器识别的文件类型有效:如zip,jpg,gif等.
具体的实现可以参照RFC 2183中的论述,见下:
...
printf("Content-Type: application/octet-stream\r\n");
printf("Content-Disposition: filename=filename.ext\r\n\r\n");
do
{
n=fread(buf,1,1024,fp);
fwrite(buf,1,n,stdout);
}while(n>0);
...
你的实现中,可以将filename.ext由你的id来指定.

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧