首页 > 解决方案 > .stl 文件下载未打开或损坏

问题描述

.stl在 c# Angular JS MVC 中下载文件时遇到问题。下载文件时,我无法以 3d 形状或其他支持 stl 文件扩展名的软件打开文件。

vm.FileDownload = function (id, hash,filename) {
        var defer = $q.defer();
        threeShapeRepo.getFile(id, hash, filename).then(function (data) {
            if (data !== null) {
                var file = new Blob([data], {
                    type: 'application/stl'
                });
                var fileURL = URL.createObjectURL(file);
                var link = document.createElement('a');
                link.href = fileURL;
                link.target = '_blank';
                link.download = filename;
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
            //window.URL.revokeObjectURL(url);
            defer.resolve(data);
        });
    }

来自 repository.js

function getFile(id, hash, fileName) {
            var params = {
                'Id': id,
                'Hash': hash,
                'FileName': fileName
            }
            var url = 'https://' + window.location.host + '/api/' + 'ThreeShape' + '/' + 'getFileAsync';
            return $http.post(url, params, { responseType: 'blob' }).then(function (data) {
                if (data.data.Content.indexOf("validation failed")!==-1) {
                    logError(data.data.Content);
                    return null;
                }
                return data.data;
            });
        }

在 c# 后端代码中:

public async Task<string> getFileAsyncInternal(GetFile request)
{
    var response = new GetThreeShapeCasesResponse();
    IList<GetOneThreeShapeCaseResult> tempCaseList = new List<GetOneThreeShapeCaseResult>();
    IRestResponse restResponse;
    var retryCount = 0;
    HttpStatusCode statusCode;
    int numericStatusCode;
    var requestUrl = "";
    InitializeThreeShapeClient();
    var restRequest = new RestRequest(Method.GET);
    if (request.Hash != null)
    {

        requestUrl = threeShapeServerLocation + "api/cases/"+ request.Id+"/attachments/"+ request.Hash;

    }
    ThreeShapeAPIClient.BaseUrl = new Uri(requestUrl);
    var getTokenOperation = await retreive3ShapeBearerTokenInternal();
    var myToken = getTokenOperation.TokenValue;
    var tokenString = "Bearer " + myToken;
    restRequest.AddHeader("Authorization", tokenString);
    restResponse = ThreeShapeAPIClient.Execute(restRequest);
    numericStatusCode = (int)restResponse.StatusCode;
    System.Web.HttpResponse httpresponse = System.Web.HttpContext.Current.Response; ;
    if (numericStatusCode == 200)
    {
        var strResult = restResponse.Content; 
        //return strResult;
        string fileName = request.FileName;
        httpresponse.ClearContent();
        httpresponse.Clear();
        byte[] buffer = new byte[restResponse.Content.Length];
        System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
        {
            FileName = fileName,
            Inline = true  // false = prompt the user for downloading;  true = browser to try to show the file inline
        };
        httpresponse.Headers.Add("Content-Disposition", "attachment;filename="+request.FileName+ ";filename*=UTF-8''" + request.FileName);
        httpresponse.Headers.Add("Content-Length",Convert.ToString(restResponse.Content.Length));
        httpresponse.Headers.Add("Contenty-Type", ((RestSharp.RestResponseBase)restResponse).ContentType);
        httpresponse.Output.Write(restResponse.Content);
        return restResponse.Content;
    }
    else if (retryCount == 0 && numericStatusCode == 401)
    {
        response.DidError = true;
        response.ErrorMessage = restResponse.Content;
    }
    return restResponse.Content;
}

我一直在努力打开下载的文件。任何形式的帮助都深表感谢。我在内容对象中得到的响应是

标签: c#angularjsasp.net-mvcc#-4.0

解决方案


我将首先比较干净副本和损坏的下载副本的文件内容以寻找线索。下载的副本真的损坏了还是实际上是空的?您是否在损坏的副本中看到了某种模式?等等 祝你好运!


推荐阅读