webservice跨服务器上传附件

最近一个项目,用到文件上传功能,本来简单地使用upload控件直接post到服务器保存,简单实现了。后来考虑到分布是部署,静态附件、图片等内容要单独服务器(命名为B服务器,一台,192.168.103.240)存储,则需要分布式服务器(命名为A服务器,可多台,测试程序就是本地 127.0.0.1)上传附件到B服务器。

考虑难易程度和易操作,简单想到的方案是:访问A服务器应用程序调用B服务器的webservice,将附件直接保存到B服务器。



简单实验一下,是可以达成效果的。

步骤一、B服务器的webservice代码如下:

 1 /// <summary>
 2     /// Summary description for UploadWebService
 3     /// </summary>
 4     [WebService(Namespace = "http://tempuri.org/")]
 5     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 6     [System.ComponentModel.ToolboxItem(false)]
 7     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
 8     // [System.Web.Script.Services.ScriptService]
 9     public class UploadWebService : System.Web.Services.WebService
10     {
11         [WebMethod]
12         public string HelloWorld()
13         {
14             return "Hello World";
15         }
16
17
18         HttpContext _context = null;
19
20         [WebMethod]
21         public string PostFile(Byte[] content, string ext)
22         {
23             _context = this.Context;
24             string text = Convert.ToBase64String(content);
25             return Upload(ext, text);
26         }
27
28         private string Upload(string ext, string content)
29         {
30             if (string.IsNullOrEmpty(ext) || string.IsNullOrEmpty(content))
31             {
32                 return "";
33             }
34             //保存图片
35             string dateNum = DateTime.Now.ToString("yyyyMM");//按月存放
36             string fileName = Guid.NewGuid() + ext;
37             string currentPath = HttpContext.Current.Request.PhysicalApplicationPath + "upload\\" + dateNum + "\\";
38             string fullPath = currentPath + fileName;
39
40             if (!Directory.Exists(currentPath))
41                 Directory.CreateDirectory(currentPath);
42
43             byte[] buffer = Convert.FromBase64String(content);
44             using (FileStream fileStream = new FileStream(fullPath, FileMode.Create))
45             {
46                 fileStream.Write(buffer, 0, buffer.Length);
47             }
48             string host = _context.Request.Url.Host;
49             int port = _context.Request.Url.Port;
50             //ResponseWrite(string.Format("http://" + host + ":" + port + "/upload/{0}/{1}", dateNum, fileName));//返回图片保存路径
51             return string.Format("http://" + host + "/" + _context.Request.ApplicationPath + "/upload/{0}/{1}", dateNum, fileName);
52         }
53 }

简单将其部署到B服务器IIS,访问验证通过,如下:

步骤二、A服务新建web项目,A服务器的web项目,添加服务引用,增加对B服务器webservice的引用。

新建上传页面,前台页面代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="school.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server" action="WebForm1.aspx" method="post" enctype="multipart/form-data">
        <div>
            <input type="file" name="upload" id="upload" runat="server" />
            <input type="submit" value="upload"/>
        </div>
    </form>
</body>
</html>

后台代码如下:

protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                var file = Request.Files["upload"];
                Stream data = file.InputStream;
                int length = (int)data.Length;
                byte[] content = new byte[length];
                data.Read(content, 0, content.Length);

                string ext = file.FileName.Substring(file.FileName.LastIndexOf(‘.‘));
                //webservice
                var client = new UploadService.UploadWebServiceSoapClient();
                string url = client.PostFile(content, ext);
                Response.Write(string.Format("<a href=\"{0}\">下载</a>", url));
            }
        }

步骤三、验证效果,如下图,输出的路径已经是B服务器的网站路径了。

步骤四、附件大小限制

上传小附件时,没有问题,但是当上传附件很大时,就会报错:

1、没有终结点在侦听可以接受消息的

2、远程服务器返回错误: (404) 未找到

是因为没有设置上传大小的限制,超过了默认值。

在B服务器的webservice的web.config内增加如下配置:

<configuration>
  <system.web>
    <compilation targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"  requestLengthDiskThreshold="256" maxRequestLength="2097151" />
  </system.web>
    <system.webServer>
      <security>
        <requestFiltering>
          <!--限制附件上传80MB-->
          <requestLimits maxAllowedContentLength="81920000" />
        </requestFiltering>
      </security>
    </system.webServer>
</configuration>

重新上传附件,问题解决。


简单思路:分布式服务器应用程序访问同一个上传接口。

时间: 2024-10-04 18:31:27

webservice跨服务器上传附件的相关文章

跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传. 问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦 直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于, 发送的时候使用"content-type" = "application/json"

springmvc中Tomcat跨服务器上传中文名文件报错解决方案

今天花了一整天时间解决tomcat跨服务器上传文件失败的问题,经过各种搜索终于解决了,下面是解决具体方法: 一.首先修改Tomcat的只读属性为false. 在tomcat的conf目录下的web.xml文件中找到<servlet>标签,添加初始化参数readonly,代码如下: <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.se

idea 内置tomcat jersey 跨服务器 上传文件报400错误

报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status of 400 Bad Request 因为跨服务器上传文件,文件名中里面含有中文名称,所以报错,解决: 让文件服务器支持utf-8编码或者将文件名变成英文.(最好的就是根据时间加随机数 或者是UUID来命名) 简单版的jsersey上传 @RequestMapping("/fileupload3&

ASP.NET跨服务器上传文件的相关解决方案

第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ Page Language="C#" EnableViewState="false"%> <%@ Import Namespace="System.Net" %><%@ Import Namespace="Syste

.NET文件跨服务器上传下载

环境说明:两台服务器服务器为A,服务器为B,服务器B为文件服务器 1.在A和B上创建用户docshareuser,用户名和密码保持一致 2.B服务器上设置附件文件夹Attachments共享,添加用户docshareuser并设置读写权限 3.在A上运行框输入"\\IP\Attachments",输入用户名密码测试是否共享成功,共享不成功请检查网络及配置问题 4.修改AWeb.config文件附件路径节点的值 <add key="键值" value="

关于nutz跨服务器上传文件

发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器.项目中功能使用form表单上传 @At @AdaptBy(type = UploadAdaptor.class, args = { "${app.root}/WEB-INF/tmp" }) public String add(@Param("upload_file")TempFile f, HttpS

七牛跨服务器上传文件带参数

HttpPostedFileBase file = Request.Files["file"]; //System.IO.Stream s = file.InputStream; byte[] buffer = new byte[1024]; //int bytesRead = 0; //while ((bytesRead = file.InputStream.Read(buffer, 0, buffer.Length)) != 0) //{ //} buffer=StreamToBy

架设用Webservice实现文件上传功能CentOS服务器(二)--WebService

功能概述,看代码中注释应该可以理解 为了文件安全对url进行适当的保护处理 简单的配置功能,如文件大小限制,文件存放位置设定等 返回文件内容方法还需完善 代码: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDate

程序windows上可以上传附件,部署到 linux服务器后出现 “上传目录 不可写” 怎么解决?

这样的问题一般都是linux  下文件读写权限引起的,用 shell  命名到上传附件的目录(如 cd /data/www/project/upload/),然后执行 shell 文件权限设置: 例如:chmod 777 -R /files/ (777 就是读写权限都有) 让后再上传就可以上传了