CGI程序: 获得HTTP POST上传的文件,并保存在本地

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include"cgic.h"

 

//author pdfccc@sina.com

 

#define BufferLen     4096
#define MAX_FILE_SIZE 20000000   // 10M

int cgiMain()
{
    cgiFilePtr   file;
    int          targetFile;
    mode_t       mode;

    char         name[256];
    char         fileNameOnServer[256];

    char         contentType[1024];
    char         buffer[BufferLen];

    char*        tmpStr = NULL;
    int          size;
    int          got, t;

    cgiHeaderContentType("text/html");


    //取得html页面中file元素的值,应该是文件在客户机上的路径名
    cgiFormResultType ret = cgiSYSErr;
    ret = cgiFormFileName("upload_file_name", name , sizeof(name));
    if( ret != cgiFormSuccess )
    {
        fprintf(stderr ,"Could not retrieve filename. ret=%d. \n", ret);
        goto FAIL;
    }
    else
    {
        printf("File name = %s. \n <br>", name);
    }


    cgiFormFileSize("upload_file_name", &size);
    printf("File size = %d.\n <br>", size);
    if ( size > MAX_FILE_SIZE )
    {
        printf("File size too big. should less than 20M.");
        goto FAIL;
    }

    //取得文件类型,不过本例中并未使用
    cgiFormFileContentType("upload_file_name", contentType , sizeof(contentType));
    printf("ContentType = %s.\n <br>", contentType);


    //web容器把文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。
    //临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件
    if( cgiFormFileOpen("upload_file_name", &file) != cgiFormSuccess)
    {
        fprintf(stderr ,"could not open the file. \n");
        goto FAIL;
    }


    t = -1;
    //从路径名解析出用户文件名
    while(1)
    {
        tmpStr = strstr(name + t + 1 ,"\\");
        if(NULL == tmpStr) tmpStr = strstr(name + t + 1 ,"/");   //if"\\"is not path separator, try"/"
        if(NULL != tmpStr) t =(int)( tmpStr-name);
        else break;
    }


    strcpy(fileNameOnServer, "uploaded/");
    strcat(fileNameOnServer, name + t + 1);         //只包含文件名
    //mode = S_IRWXU | S_IRGRP | S_IROTH;            //0666
   
    printf("ready write to server path: %s. <br>", fileNameOnServer);

    mode = 0666;


    //在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录)建立新文件
    targetFile = open(fileNameOnServer , O_RDWR|O_CREAT|O_TRUNC|O_APPEND , mode);
    if( targetFile < 0)
    {
        fprintf(stderr ,"could not create the new file, %s. \n", fileNameOnServer);
        goto  FAIL;
    }

    printf("<br>");

    //从系统临时文件中读出文件内容,并放到刚创建的目标文件中
    while(cgiFormFileRead(file , buffer , BufferLen , &got) == cgiFormSuccess)
    {
        if(got > 0) write(targetFile , buffer , got);
        printf(".");
    }


    cgiFormFileClose(file);
    close(targetFile);
    goto   END;

FAIL:
    fprintf(stderr ,"Failed to upload.");
    return   1;
   
END:
    printf("File %s has been uploaded.", fileNameOnServer);
   
    printf("<br><br> 下载该文件请使用: <H3>http://172.27.194.147:8080/js/%s</H3> <br>", fileNameOnServer);
   
    return   0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值