如何创建一个文件不让它写入磁盘只放在内存中,并且任何程序都能读写它?

时间:2022-01-08 18:29:55
写cgi脚本时在缓冲区的二进制数据要首先在磁盘中创建文件再把数据写进去然后再用<img src=>显示出来,我没有找到怎样把缓冲区的数据直接输出给浏览器的方法就像这样<img src=缓冲区指针>所以才问问大家:
  如何创建一个文件不让它写入磁盘只放在内存中,并且任何程序都能读写它?

15 个解决方案

#1


那要看你的系统支不支持 内存文件系统
如果是linux, tmp下的所有文件都是只在 内存里面的!!

#2


windows下能行吗?

#3


IPC机制

#4


gz

#5


呵呵!
楼主在chinaunix上面也混吧
我见过这个帖子

#6


为什么非要在内存里而不能写到磁盘呢?先说原因,再找解决的办法,或者办法就不止一种。

#7


因为要把数据库中的数据直接输出到网页上,不用创建到磁盘上再用<img src=>显示出来,麻烦
  我的目的是把用户上传过来图片文件保存到数据库中,然后连同文字图片一同在浏览器中显示出来,因为http协议如果要在浏览器中同时显示文本和图片的话只能用<img src=>,但是<img src=>我所知道得再src=后面加一个文件名,所以想在内存中直接把缓冲区的数据直接写到文件中是使文件不交换到磁盘就用<img src=>传给客户浏览器

#8


正好也看到了在CU上别人给你的回复。明白你想做什么。我觉得你应该这么做,把用户上传的数据,存在数据库里,编上号,当生成页面的时候,返回给客户<img src=image.asp?334343434>的形式,其中,image.asp就是你要写的脚本文件,334343434就是相应的图片文件在数据库中的编号,当客户的浏览器收到<img src=image.asp?334343434>之类的内容时,会自动向服务器发起一起http请求,来获取image.asp?334343434,你在image.asp中取出请求中的文件号,然后到数据库中取出文件内容,并设定http的Content-type:image/png,然后把数据库中取出的数据写回客户端,就行了。

#9


我写了一个不行呀?
#if 1
#define SERVER_NAME cgiServerName
#endif
#if 0
#define SERVER_NAME "www.boutell.com"
#endif
#ifdef WIN32
#define SAVED_ENVIRONMENT "c:\\cgicsave.env"
#else
#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
#endif /* WIN32 */

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>

void LoadEnvironment();

int cgiMain() {

#ifdef DEBUG
        LoadEnvironment();
#endif
        if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
                LoadEnvironment();
        }
        cgiHeaderContentType("text/html");
        fprintf(cgiOut, "<HTML><HEAD>\n");
        fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n");
        fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");
        fprintf(cgiOut,"<p>\n");
        fprintf(cgiOut,"可以输出图片吗?\n");
        fprintf(cgiOut,"</p>\n");
        fprintf(cgiOut,"<img src=\"cgigif.exe\">\n");  /*这里是关键*/
        fprintf(cgiOut, "</BODY></HTML>\n");
        return 0;
}

void LoadEnvironment()
{
        if (cgiReadEnvironment(SAVED_ENVIRONMENT) != 
                cgiEnvironmentSuccess) 
        {
                cgiHeaderContentType("text/html");
                fprintf(cgiOut, "<head>Error</head>\n");
                fprintf(cgiOut, "<body><h1>Error</h1>\n");
                fprintf(cgiOut, "cgiReadEnvironment failed. Most "
                        "likely you have not saved an environment "
                        "yet.\n");
                exit(0);
        }
}


cgigif.c主要部分除了cgiMain函数不同其他和上面一样如下:
int cgiMain() {

#ifdef DEBUG
        LoadEnvironment();
#endif
        if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
                LoadEnvironment();
        }
        cgiHeaderContentType("Content-type:image/gif");
FILE *gif;
int i;
char buff[3001];
gif=fopen("apache.gif","rb+");
i=fread(buff,1,3001,gif);
fwrite(buff,1,i,cgiOut);
fclose(gif);

        return 0;
}

编译通过,运行图片没显示出来,图片属性显示:http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe

#10


http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe?1333
问号这部分好像是不能省的,参数你可以暂时随便定,但好像必须得有,不记得为什么了,只是有这么一点点印象。N年前看过CGI的书。
另外,你看一下服务器端的log,看看有没有收到http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe?32333之类的请求。

#11


我用这段代码:
FILE *gif;
int i;
char buff[3001];
gif=fopen("apache.gif","rb+");
i=fread(buff,1,3001,gif);
fwrite(buff,1,i,cgiOut);
fclose(gif);
直接吧数据写出去了,你看这样能行吗?你写asp脚本是直接输出数据吗?

#12


我已经经过修改程序实现了用<img src=cgi输出图片脚本>,从而也可以直接将数据库中的图片直接输出到客户浏览器。

  也衷心的谢谢al0n9

  同时也回复xddzccn:你说得对我的确也在cu混,正是靠着两边的朋友热心的帮助我才实现了我的程序我也要感谢cu和csdn,它们都是优秀的网站!

#13


加上动态参数的原因是避免使用代理服务器访问时获取到旧的图片.CSDN的帖子的路径里面有?temp=就是这个原因

#14


动态链接库DLL内创建一个内存影射文件即可

#15


非的要文件吗?
一段buffer不行吗?

#1


那要看你的系统支不支持 内存文件系统
如果是linux, tmp下的所有文件都是只在 内存里面的!!

#2


windows下能行吗?

#3


IPC机制

#4


gz

#5


呵呵!
楼主在chinaunix上面也混吧
我见过这个帖子

#6


为什么非要在内存里而不能写到磁盘呢?先说原因,再找解决的办法,或者办法就不止一种。

#7


因为要把数据库中的数据直接输出到网页上,不用创建到磁盘上再用<img src=>显示出来,麻烦
  我的目的是把用户上传过来图片文件保存到数据库中,然后连同文字图片一同在浏览器中显示出来,因为http协议如果要在浏览器中同时显示文本和图片的话只能用<img src=>,但是<img src=>我所知道得再src=后面加一个文件名,所以想在内存中直接把缓冲区的数据直接写到文件中是使文件不交换到磁盘就用<img src=>传给客户浏览器

#8


正好也看到了在CU上别人给你的回复。明白你想做什么。我觉得你应该这么做,把用户上传的数据,存在数据库里,编上号,当生成页面的时候,返回给客户<img src=image.asp?334343434>的形式,其中,image.asp就是你要写的脚本文件,334343434就是相应的图片文件在数据库中的编号,当客户的浏览器收到<img src=image.asp?334343434>之类的内容时,会自动向服务器发起一起http请求,来获取image.asp?334343434,你在image.asp中取出请求中的文件号,然后到数据库中取出文件内容,并设定http的Content-type:image/png,然后把数据库中取出的数据写回客户端,就行了。

#9


我写了一个不行呀?
#if 1
#define SERVER_NAME cgiServerName
#endif
#if 0
#define SERVER_NAME "www.boutell.com"
#endif
#ifdef WIN32
#define SAVED_ENVIRONMENT "c:\\cgicsave.env"
#else
#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
#endif /* WIN32 */

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>

void LoadEnvironment();

int cgiMain() {

#ifdef DEBUG
        LoadEnvironment();
#endif
        if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
                LoadEnvironment();
        }
        cgiHeaderContentType("text/html");
        fprintf(cgiOut, "<HTML><HEAD>\n");
        fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n");
        fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");
        fprintf(cgiOut,"<p>\n");
        fprintf(cgiOut,"可以输出图片吗?\n");
        fprintf(cgiOut,"</p>\n");
        fprintf(cgiOut,"<img src=\"cgigif.exe\">\n");  /*这里是关键*/
        fprintf(cgiOut, "</BODY></HTML>\n");
        return 0;
}

void LoadEnvironment()
{
        if (cgiReadEnvironment(SAVED_ENVIRONMENT) != 
                cgiEnvironmentSuccess) 
        {
                cgiHeaderContentType("text/html");
                fprintf(cgiOut, "<head>Error</head>\n");
                fprintf(cgiOut, "<body><h1>Error</h1>\n");
                fprintf(cgiOut, "cgiReadEnvironment failed. Most "
                        "likely you have not saved an environment "
                        "yet.\n");
                exit(0);
        }
}


cgigif.c主要部分除了cgiMain函数不同其他和上面一样如下:
int cgiMain() {

#ifdef DEBUG
        LoadEnvironment();
#endif
        if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
                LoadEnvironment();
        }
        cgiHeaderContentType("Content-type:image/gif");
FILE *gif;
int i;
char buff[3001];
gif=fopen("apache.gif","rb+");
i=fread(buff,1,3001,gif);
fwrite(buff,1,i,cgiOut);
fclose(gif);

        return 0;
}

编译通过,运行图片没显示出来,图片属性显示:http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe

#10


http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe?1333
问号这部分好像是不能省的,参数你可以暂时随便定,但好像必须得有,不记得为什么了,只是有这么一点点印象。N年前看过CGI的书。
另外,你看一下服务器端的log,看看有没有收到http://10.0.0.1/cgi-bin/10.0.0.1/cgi-bin/cgigif.exe?32333之类的请求。

#11


我用这段代码:
FILE *gif;
int i;
char buff[3001];
gif=fopen("apache.gif","rb+");
i=fread(buff,1,3001,gif);
fwrite(buff,1,i,cgiOut);
fclose(gif);
直接吧数据写出去了,你看这样能行吗?你写asp脚本是直接输出数据吗?

#12


我已经经过修改程序实现了用<img src=cgi输出图片脚本>,从而也可以直接将数据库中的图片直接输出到客户浏览器。

  也衷心的谢谢al0n9

  同时也回复xddzccn:你说得对我的确也在cu混,正是靠着两边的朋友热心的帮助我才实现了我的程序我也要感谢cu和csdn,它们都是优秀的网站!

#13


加上动态参数的原因是避免使用代理服务器访问时获取到旧的图片.CSDN的帖子的路径里面有?temp=就是这个原因

#14


动态链接库DLL内创建一个内存影射文件即可

#15


非的要文件吗?
一段buffer不行吗?