.Net C#向远程服务器Api上传文件

Api服务代码一:

        /// <summary>
        /// 服务器接收接口
        /// </summary>
        [HttpPost]
        [Route("ReceiveFile")]
        public HttpResponseMessage ReceiveFile()
        {
            string result = string.Empty;
            ArrayList list = new ArrayList();
            try
            {
                Stream postStream = HttpContext.Current.Request.InputStream;
                byte[] b = new byte[postStream.Length];

                string postFileName = DNTRequest.GetString("fileName");
                if (string.IsNullOrEmpty(postFileName) && HttpContext.Current.Request["fileName"] != null)
                {
                    postFileName = HttpContext.Current.Request["fileName"];
                }
                string fileExtension = Path.GetExtension(postFileName);
                string dirName = "other";
                if (!string.IsNullOrEmpty(fileExtension))
                {
                    dirName = fileExtension.Substring(fileExtension.LastIndexOf(".") + 1);
                }
                string dir = "/_temp/file/" + dirName + "/" + DateTime.Now.ToString("yyyyMMdd") + "/";
                string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff");
                fileName += fileExtension;
                string filePath = HttpContext.Current.Server.MapPath(dir);
                string saveFilePath = Path.Combine(filePath, fileName);
                string dirPath = dir + fileName;
                list.Add(dirPath);

                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }

                FileStream fs = new FileStream(saveFilePath, FileMode.Create);
                byte[] new_b = new byte[1024];
                const int rbuffer = 1024;

                while (postStream.Read(new_b, 0, rbuffer) != 0)
                {
                    fs.Write(new_b, 0, rbuffer);
                }
                postStream.Close();
                fs.Close();
                fs.Dispose();

                if (list.Count > 0)
                {
                    result = DNTRequest.GetResultJson(true, "success", string.Join(",", list.ToArray()));
                }
            }
            catch (Exception ex)
            {
                result = DNTRequest.GetResultJson(false, ex.Message, null);
            }
            HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(result, Encoding.GetEncoding("UTF-8"), "text/plain") };
            return responseMessage;
        }

Api服务代码二:

        [HttpPost]
        [Route("ReceiveFileTest")]
        public HttpResponseMessage ReceiveFileTest()
        {
            string result = string.Empty;
            var request = HttpContext.Current.Request;
            try
            {
                if (request.Files.Count > 0)
                {
                    var fileNameList = new List<string>();
                    string dirName = "other";
                    foreach (string f in request.Files)
                    {
                        var file = request.Files[f];

                        string fileExtension = Path.GetExtension(file.FileName).ToLower();
                        string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff");
                        fileName += fileExtension;
                        if (!string.IsNullOrEmpty(fileExtension))
                        {
                            dirName = fileExtension.Substring(fileExtension.LastIndexOf(".") + 1);
                        }
                        string dir = "/_temp/file/" + dirName + "/" + DateTime.Now.ToString("yyyyMMdd") + "/";
                        string filePath = HttpContext.Current.Server.MapPath(dir);
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        string fileSavePath = Path.Combine(filePath, fileName);

                        Stream postStream = file.InputStream;
                        //
                        FileStream fs = new FileStream(fileSavePath, FileMode.Create);
                        byte[] new_b = new byte[1024];
                        const int rbuffer = 1024;

                        while (postStream.Read(new_b, 0, rbuffer) != 0)
                        {
                            fs.Write(new_b, 0, rbuffer);
                        }
                        postStream.Close();
                        fs.Close();
                        fs.Dispose();

                        string dirPath = dir + fileName;
                        fileNameList.Add(dirPath);
                        fileNameList.Add(fileName);
                    }

                    result = DNTRequest.GetResultJson(true, string.Format("{0}:{1}", HttpStatusCode.OK, string.Join(",", fileNameList.ToArray())), null);
                }
                else
                {
                    result = DNTRequest.GetResultJson(false, "请选择上传的文件", null);
                }
            }
            catch (Exception ex)
            {
                result = DNTRequest.GetResultJson(false, ex.Message, null);
            }
            HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(result, Encoding.GetEncoding("UTF-8"), "text/plain") };
            return responseMessage;
        }

Ajax提交file代码,调用Api代码一的Script:

此方法后端Api代码一中始终获取不到文件名,所以我在Ajax的url中加了?fileName=fileObj.name,这样调试能走通。为什么Ajax提交时不能获取到文件名,我还在研究。

<script>

        $("#inpSubmit").click(function () {
            //var fileObj = new FormData($("#importModel")[0]);
            var fileObj = document.getElementById("inpFileControl").files[0];
            if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
                alert("请选择文件");
                return;
            }
            //console.log(fileObj);

            var formFile = new FormData();
            formFile.append("fileName", fileObj.name);
            formFile.append("file", fileObj);
            //console.log(JSON.stringify(formFile));

            //var paramters = {};
            //paramters.timestamp = new Date().getTime();
            //paramters.fileName = fileObj.name;
            //paramters.file = fileObj;
            //console.log(JSON.stringify(paramters));

            $.ajax({
                type: "post",
                url: "http://localhost:19420/Api/ReceiveFile?fileName=" + fileObj.name,
                dataType: "json",
                //contentType: false,
                processData: false,//用于对data参数进行序列化处理,默认值是true。默认情况下发送的数据将被转换为对象,如果不希望把File转换,需要设置为false
                cache: false,
                data: fileObj,
                success: function (json) {
                    if (json.result) {
                        $("#inpFileUrl").val(json.data);
                        console.log(json.data);
                    }
                    else {
                        alert(json.msg);
                    }
                },
                error: function (ret) {
                    console.log(ret.responseText);
                }
            });
            return false;
        });
    </script>

Ajax提交file代码,调用Api代码一的Html:

<form>
    <fieldset>
        <legend>Ajax提交到远程服务器Api</legend>
        <div class="form-group">
            <label class="col-sm-2 control-label" for="ds_host">选择文件</label>
            <div class="col-sm-4">
                <input class="form-control" id="inpFileUrl" name="inpFileUrl" type="text" placeholder="上传后返回地址" />
            </div>
            <div class="col-sm-4">
                <input type="file" id="inpFileControl" name="file" />
            </div>
            <div class="col-sm-2">
                <input id="inpSubmit" name="inpSubmit" type="button" value="提交" />
            </div>
        </div>
    </fieldset>
</form>

Form表单提交Post到远程Api代码二中,这个很顺利。下边是Html

<form action="http://localhost:19420/Api/ReceiveFileTest" method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>Form表单提交到远程服务器Api</legend>
        <div class="form-group">
            <label class="col-sm-2 control-label" for="ds_host">选择文件</label>
            <div class="col-sm-4">
                <input class="form-control" id="inpFileUrl2" name="inpFileUrl2" type="text" placeholder="上传后返回地址" />
            </div>
            <div class="col-sm-4">
                <input type="file" name="file" />
            </div>
            <div class="col-sm-2">
                <input type="submit" value="提交" />
            </div>
        </div>
    </fieldset>
</form>

Api服务部署时需要考虑到客户端提交file时有跨域问题,快捷方法是在IIS中设置Access-Control-Allow-Origin:*,但这样做有安全问题。

网站上传文件大小默认4M,所以网站配置文件中需要设置,如下:

  <system.web>
    <httpRuntime maxRequestLength="409600" />
  </system.web>

服务器IIS上传文件大小也有限制,也要做设置,如下:

  <system.webServer>
    <security>
      <requestFiltering>
        <!--2G/2072576000|500M/518144000-->
        <requestLimits maxAllowedContentLength="518144000"/>
      </requestFiltering>
    </security>
  </system.webServer>

以上是我近2天的研究成果,不算完善还需要改进。

Api中使用了三方框架RestSharp,请在解决方案中找NuGet添加。

外部操作类用到的方法有,一:

        /// <summary>
        /// 拼装JSON
        /// </summary>
        static public string GetResultJson(bool result, string msg, Object data)
        {
            string resultJson = string.Empty;
            Hashtable ht = new Hashtable();
            try
            {
                ht.Add("result", result);
                ht.Add("msg", msg);
                ht.Add("data", data);
            }
            catch (Exception ex)
            {
                ht.Add("result", false);
                ht.Add("msg", ex.Message);
            }
            resultJson = Newtonsoft.Json.JsonConvert.SerializeObject(ht);
            return resultJson;
        }

注意:Html代码中file控件需要有name=“file”属性,否则提交后Api获取不到file对象,如下。

<input type="file" name="file" />

第三种方法是form表单提交调用mvc的control,control在调用Api代码二,这个测试失败,能上传文件,但上传的文件不能打开是损坏的,正在想办法解决。

下边是第三种方法的Html代码:

<form action="/Test/UploadFileTest" method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>Form表单提交到本地Control</legend>
        <div class="form-group">
            <label class="col-sm-2 control-label" for="ds_host">选择文件</label>
            <div class="col-sm-4">
                <input class="form-control" id="inpFileUrl3" name="inpFileUrl3" type="text" placeholder="上传后返回地址" />
            </div>
            <div class="col-sm-4">
                <input type="file" name="file" />
            </div>
            <div class="col-sm-2">
                <input type="submit" value="提交" />
            </div>
        </div>
    </fieldset>
</form>

下边是第三种方法的Control代码:

        [HttpPost]
        public ActionResult UploadFileTest()
        {
            string result = string.Empty;

            string apiUrl = "http://localhost:19420/Api/ReceiveFileTest";
            string contentType = "application/octet-stream";

            var files = new List<string>();
            foreach (string f in Request.Files)
            {
                var file = Request.Files[f];
                var request = new RestRequest(Method.POST);
                request.AlwaysMultipartFormData = true;
                //request.AddParameter("fileName", file.FileName);
                Stream postStream = file.InputStream;
                byte[] b = new byte[postStream.Length];
                request.AddFile("file", b, file.FileName, contentType);

                var restClient = new RestClient { BaseUrl = new Uri(apiUrl) };
                string res = string.Empty;
                IRestResponse<Object> response = restClient.Execute<Object>(request);
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    res = response.Content;
                }
                else
                {
                    res = string.Format("{0}:{1}", response.StatusCode, response.Content);
                }
                files.Add(res);
            }
            if (files.Count > 0) {
                result = string.Join(",", files.ToArray());
            }

            return Json(result);
        }

原文地址:https://www.cnblogs.com/hofmann/p/10757268.html

时间: 2024-10-01 22:38:17

.Net C#向远程服务器Api上传文件的相关文章

mac 连接远程服务器、上传文件

1.连接远程服务器: ssh 命令 +用户名@服务器域名 ssh [email protected] 2.上传文件到远程服务器:scp 命令 +本地文件路径 + 用户名@服务器域名:服务器上存放的文件路径 MAC20151009AdeMac-mini:~ admin$ scp ~/documents/wx_sample.php [email protected]:/srv/www/li753-107.members.linode.com/public_html/wx/

php 下 html5 XHR2 + FormData + File API 上传文件

FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormData的最大优点就是我们可以异步上传一个二进制文件. 例1如下: <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>

从Linux服务器下载上传文件

首先要确定好哪两种的连接:Linux常用的有centors和unbantu两种版本,PC端Mac和Windows 如果在两个Linux之间传输,或Linux和Mac之间传输可以使用scp命令,类似于ssh连接 无论从本地复制到远程还是远程复制到本地,命令都是在本地书写的 不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是采用samba服务,类似Wi

利用百度云盘API上传文件至百度云盘

一.获取Access Token示例 1. 请您将以下HTTP请求直接粘贴到浏览器地址栏内,并按下回车键. https://openapi.baidu.com/oauth/2.0/authorize?response_type=token&client_id=L6g70tBRRIXLsY0Z3HwKqlRE&redirect_uri=oob&scope=netdisk 2.执行后,弹出百度登录页面,登录后弹出以下授权页面: 3.授权后,将跳转到以下百度OAuth2.0页面: 4.请

腾讯云服务器如何上传文件

转自 http://bbs.qcloud.com/thread-9949-1-1.html: 之前一直用的是新浪sae,突然账号就不能用了,从新注册各种烦,过段换了腾讯. 登录 https://console.qcloud.com/cvm 然后更换系统,选择使用其他镜像安装,然后选项里面选择可视化云面板 下面推荐 <ignore_js_op> 安装 好后 在开始 -程序里找到 腾云助手IIS注意: 切勿随便更改软件目录下所有文件 的名称.文件件的名称以及位置等!!!! 1.安装好软件后,请先切

服务器打包上传文件

首先使用xshell连接到数据库,记得配置xshell的语言为utf8 default,不然输出的日志是乱码的,看不懂, 然后进入到指定的文件夹,先把本地的文件在文件夹中打包成zip文件,点击上传,这样代码就到了服务器上当前文件夹中,在命令行工具中进入到此文件夹中unzip test.zip,就能解压test.zip文件,如果有重名的文件,系统会自动提示你是覆盖呢还是不覆盖,自己根据提示语选择就行,其实好简单.

PHP open_basedir配置未包含upload_tmp_dir 导致服务器不能上传文件

在做一个上传图片的功能时候发现后台接收到的$_FILES['file']['error'] = 6,这个错误意思是找不到临时文件,或者是临时文件夹无权限,需要更改php.ini文件的 upload_tmp_dir,指定临时文件的路径,这个路径必须要在open_basedir的路径的下边,由于open_basedir不包含upload_tmp_dir ,导致PHP不能访问除open_basedir目录以外的其它目录,自然也就不能将客户端POST过来的数据保存在上传临时目录下面了. 原文地址:htt

在Win7 环境使用Java API 上传文件到 Hadoop2.x HDFS 问题统计

问题一: org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x 解决方案: 在本地系统(WIN7)的环境变量或java JVM变量里面添加HAD

hadoop实践02---eclipse操作hdfs的api上传文件

1.eclipse中编写代码后双击main方法--->Run as ---> java application ,然后指定的文件 就会提交到hdfs中. 2.查看文件:http://192.168.108.128:50070/dfshealth.html#tab-overview package hdfs24; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Confi