将文件写入服务器时出现500内部服务器错误

时间:2016-05-03 23:05:54

标签: android asp.net file-upload xamarin

我正在开发一个使用Xamarin的Android应用程序,将文件上传到服务器。我的服务器是基于asp.net的,由azure托管。当代码尝试将文件写入服务器目录时,Xamarin会抛出此错误。我用来将文件发布到服务器的代码如下:

        public async Task<HttpResponseMessage> UploadFile(byte[] file)
    {
        videoThumbName = Guid.NewGuid().ToString();
        var progress = new System.Net.Http.Handlers.ProgressMessageHandler();

        progress.HttpSendProgress += progress_HttpSendProgress;

        using (var client = HttpClientFactory.Create(progress))
        {
            client.BaseAddress = new Uri(GlobalVariables.host);

            // Set the Accept header for BSON.
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/bson"));

            var request = new uploadFileModel { data = file, dateCreated = DateTime.Now, fileName = fileName, username = loggedUser, VideoThumbName = videoThumbName};

            // POST using the BSON formatter.
            MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
            var m = client.MaxResponseContentBufferSize;
            var result = await client.PostAsync("api/media/upload", request, bsonFormatter);

            return result.EnsureSuccessStatusCode();
        }
    }

我尝试过使用try catch块,奇怪的是即使在将文件写入路径并且我得到500内部服务器错误后也会捕获异常。到目前为止,我尝试上传的每个文件都保存到路径中,但我无法弄清楚为什么会发生错误。

我的服务器端代码如下所示:

       [HttpPost]
    [Route("upload")]
    public async Task<HttpResponseMessage> Upload(uploadFileModel model)
    {


        var result = new HttpResponseMessage(HttpStatusCode.OK);

        if (ModelState.IsValid)
        {
            string thumbname = "";
            string resizedthumbname = Guid.NewGuid() + "_yt.jpg";

            string FfmpegPath = Encoding_Settings.FFMPEGPATH;

            string tempFilePath = Path.Combine(HttpContext.Current.Server.MapPath("~/tempuploads"), model.fileName);
            string pathToFiles = HttpContext.Current.Server.MapPath("~/tempuploads");
            string pathToThumbs = HttpContext.Current.Server.MapPath("~/contents/member/" + model.username + "/thumbs");
            string finalPath = HttpContext.Current.Server.MapPath("~/contents/member/" + model.username + "/flv");
            string resizedthumb = Path.Combine(pathToThumbs, resizedthumbname);


            var outputPathVid = new MediaFile { Filename = Path.Combine(finalPath, model.fileName) };
            var inputPathVid = new MediaFile { Filename = Path.Combine(pathToFiles, model.fileName) };
            int maxWidth = 380;
            int maxHeight = 360;

            var namewithoutext = Path.GetFileNameWithoutExtension(Path.Combine(pathToFiles, model.fileName));
            thumbname = model.VideoThumbName;
            string oldthumbpath = Path.Combine(pathToThumbs, thumbname);


            var fileName = model.fileName;
            try
            {
                File.WriteAllBytes(tempFilePath, model.data);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }



            if (model.fileName.Contains("audio"))
            {
                File.WriteAllBytes(Path.Combine(finalPath, model.fileName), model.data);

                string audio_thumb = "mic_thumb.jpg";
                string destination = Path.Combine(pathToThumbs, audio_thumb);
                string source = Path.Combine(pathToFiles, audio_thumb);
                if (!System.IO.File.Exists(destination))
                {
                    System.IO.File.Copy(source, destination, true);
                }


                Video_Struct vd = new Video_Struct();
                vd.CategoryID = 0; // store categoryname or term instead of category id
                vd.Categories = "";
                vd.UserName = model.username;
                vd.Title = "";
                vd.Description = "";
                vd.Tags = "";
                vd.OriginalVideoFileName = model.fileName;
                vd.VideoFileName = model.fileName;
                vd.ThumbFileName = "mic_thumb.jpg";
                vd.isPrivate = 0;
                vd.AuthKey = "";
                vd.isEnabled = 1;
                vd.Response_VideoID = 0; // video responses
                vd.isResponse = 0;
                vd.isPublished = 1;
                vd.isReviewed = 1;
                vd.Thumb_Url = "none";
                //vd.FLV_Url = flv_url;
                vd.Embed_Script = "";
                vd.isExternal = 0; // website own video, 1: embed video
                vd.Type = 0;
                vd.YoutubeID = "";
                vd.isTagsreViewed = 1;
                vd.Mode = 0; // filter videos based on website sections
                long videoid = VideoBLL.Process_Info(vd, false);
            }

这个例外并没有让我理解这个问题。奇怪的是,当我向本地服务器发送请求时,我没有收到任何错误。知道这里可能有什么问题吗?

修改

当我在代码的这一行using (var engine = new Engine())收到内部服务器错误时,不再出现异常这是我试图用来编码媒体文件的库。如果一切都在本地服务器上工作,那么为什么它不在实时服务器上:/

using (var engine = new Engine())
                {
                    engine.GetMetadata(inputPathVid);

                    // Saves the frame located on the 15th second of the video.
                    var outputPathThumb = new MediaFile { Filename = Path.Combine(pathToThumbs, thumbname+".jpg") };
                    var options = new ConversionOptions { Seek = TimeSpan.FromSeconds(0), CustomHeight = 360, CustomWidth = 380 };
                    engine.GetThumbnail(inputPathVid, outputPathThumb, options);

                }

                Image image = Image.FromFile(Path.Combine(pathToThumbs, thumbname+".jpg"));

                //var ratioX = (double)maxWidth / image.Width;
                //var ratioY = (double)maxHeight / image.Height;
                //var ratio = Math.Min(ratioX, ratioY);

                var newWidth = (int)(maxWidth);
                var newHeight = (int)(maxHeight);

                var newImage = new Bitmap(newWidth, newHeight);
                Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
                Bitmap bmp = new Bitmap(newImage);
                bmp.Save(Path.Combine(pathToThumbs, thumbname+"_resized.jpg"));

                //File.Delete(Path.Combine(pathToThumbs, thumbname));

                using (var engine = new Engine())
                {

                    var conversionOptions = new ConversionOptions
                    {
                        VideoSize = VideoSize.Hd720,
                        AudioSampleRate = AudioSampleRate.Hz44100,
                        VideoAspectRatio = VideoAspectRatio.Default
                    };

                    engine.GetMetadata(inputPathVid);
                    engine.Convert(inputPathVid, outputPathVid, conversionOptions);

                }

                File.Delete(tempFilePath);

                Video_Struct vd = new Video_Struct();
                vd.CategoryID = 0; // store categoryname or term instead of category id
                vd.Categories = "";
                vd.UserName = model.username;
                vd.Title = "";
                vd.Description = "";
                vd.Tags = "";
                vd.Duration = inputPathVid.Metadata.Duration.ToString();
                vd.Duration_Sec = Convert.ToInt32(inputPathVid.Metadata.Duration.Seconds.ToString());
                vd.OriginalVideoFileName = model.fileName;
                vd.VideoFileName = model.fileName;
                vd.ThumbFileName = thumbname+"_resized.jpg";
                vd.isPrivate = 0;
                vd.AuthKey = "";
                vd.isEnabled = 1;
                vd.Response_VideoID = 0; // video responses
                vd.isResponse = 0;
                vd.isPublished = 1;
                vd.isReviewed = 1;
                vd.Thumb_Url = "none";
                //vd.FLV_Url = flv_url;
                vd.Embed_Script = "";
                vd.isExternal = 0; // website own video, 1: embed video
                vd.Type = 0;
                vd.YoutubeID = "";
                vd.isTagsreViewed = 1;
                vd.Mode = 0; // filter videos based on website sections
                //vd.ContentLength = f_contentlength;
                vd.GalleryID = 0;
                long videoid = VideoBLL.Process_Info(vd, false);

            }`enter code here`

0 个答案:

没有答案