34

ASP.NET Web API を使用してファイルをアップロードしています。RC の前にこれを実行しましたが、何らかの理由でファイルがファイル名ではなく「BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af」として保存されています。以下の filename 変数は、ファイル名の代わりにこの bodypart 文字列も返します。私はどこが間違っているのか理解できないようです。どんな助けでも大歓迎です。

クライアントコード:

function upload() {
    $("#divResult").html("Uploading...");
    var formData = new FormData($('form')[0]); 
    $.ajax({
        url: 'api/files/uploadfile?folder=' + $('#ddlFolders').val(),
        type: 'POST',
        success: function (data) {
            $("#divResult").html(data);
        },
        data: formData,
        cache: false,
        contentType: false,
        processData: false
    });
}; 

コントローラ:

    public Task<HttpResponseMessage> UploadFile([FromUri]string folder)
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
        }

        // Save file
        MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
        Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);

        return task.ContinueWith<HttpResponseMessage>(contents =>
        {
            string filename = provider.BodyPartFileNames.First().Value;
            return new HttpResponseMessage()
          {
              Content = new StringContent(string.Format("File saved in {0}.", folder))
          };

        }, TaskScheduler.FromCurrentSynchronizationContext());

ファイルは次のようになります。

ここに画像の説明を入力

4

3 に答える 3

48

これは私たちが行った意識的な変更でした。Content-Disposition ヘッダー フィールドで提供されたファイル名を使用することはセキュリティ リスクと見なされたため、代わりに、表示されているファイル名を計算するようになりました。

サーバーのローカル ファイル名を自分で制御したい場合は、MultipartFormDataStreamProvider から派生させ、GetLocalFileName をオーバーライドして、任意の名前を指定できます。ただし、セキュリティ上の考慮事項がある場合があることに注意してください。

お役に立てれば、

ヘンリク

于 2012-06-10T20:57:01.543 に答える
14

ここで、これは私のために働きます

API コントローラーで

// We implement MultipartFormDataStreamProvider to override the filename of File which
// will be stored on server, or else the default name will be of the format like Body-
// Part_{GUID}. In the following implementation we simply get the FileName from 
// ContentDisposition Header of the Request Body.
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public CustomMultipartFormDataStreamProvider(string path) : base(path) { }

    public override string GetLocalFileName(HttpContentHeaders headers)
    {
        return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
    }
}

それで

 string root = HttpContext.Current.Server.MapPath("~/App_Data");       
 CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root);

ありがとう、

于 2015-12-07T02:23:16.480 に答える