【问题标题】:How to store file into inetpub\wwwroot instead of local machine folder on UWP application如何将文件存储到 inetpub\wwwroot 而不是 UWP 应用程序上的本地计算机文件夹
【发布时间】:2017-11-15 02:47:16
【问题描述】:

我目前正在为我的学校项目开发一个 UWP 应用程序,其中一个页面允许用户为自己拍照。我按照本教程创建了该功能:CameraStarterKit

现在我将拍摄的照片存储在我桌面的图片文件夹中。但是我的项目的要求是将拍摄的图片存储在 inetpub\wwwroot 下一个名为“Photos”的文件夹中。

我真的不明白 wwwroot 或 IIS 是什么......因此,我不知道应该如何修改我的代码并将它们存储到文件夹中。

以下是我在本地桌面上存储的代码:

private async Task TakePhotoAsync()
    {
        idleTimer.Stop();
        idleTimer.Start();

        var stream = new InMemoryRandomAccessStream();

        //MediaPlayer mediaPlayer = new MediaPlayer();
        //mediaPlayer.Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/camera-shutter-click-03.mp3"));
        //mediaPlayer.Play();

        Debug.WriteLine("Taking photo...");
        await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), stream);




        try
        {
            var file = await _captureFolder.CreateFileAsync("NYPVisitPhoto.jpg", CreationCollisionOption.GenerateUniqueName);
            Debug.WriteLine("Photo taken! Saving to " + file.Path);

            var photoOrientation = CameraRotationHelper.ConvertSimpleOrientationToPhotoOrientation(_rotationHelper.GetCameraCaptureOrientation());

            await ReencodeAndSavePhotoAsync(stream, file, photoOrientation);
            Debug.WriteLine("Photo saved!");


        }
        catch (Exception ex)
        {
            // File I/O errors are reported as exceptions
            Debug.WriteLine("Exception when taking a photo: " + ex.ToString());
        }



    }

对于文件的存储:

private static async Task ReencodeAndSavePhotoAsync(IRandomAccessStream stream, StorageFile file, PhotoOrientation photoOrientation)
    {
        using (var inputStream = stream)
        {
            var decoder = await BitmapDecoder.CreateAsync(inputStream);

            using (var outputStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream, decoder);

                var properties = new BitmapPropertySet { { "System.Photo.Orientation", new BitmapTypedValue(photoOrientation, PropertyType.UInt16) } };

                await encoder.BitmapProperties.SetPropertiesAsync(properties);
                await encoder.FlushAsync();
            }
        }
    }

【问题讨论】:

  • 您无法使用 UWP 执行此操作,该应用无权访问该文件夹。您可以考虑使用另一个组件来执行此操作,例如自动将拍摄的图片从图片库复制到该文件夹​​的脚本。
  • 您好,感谢您提供的信息...但我可以知道我们无法使用 UWP 执行此操作的原因吗?所以我给我的老师写了一份报告,向他们解释我为什么能这样做。另外,我可能想尝试将图片库中的照片复制到文件夹中,但我该怎么做呢?像javascript一样的脚本?非常感谢!:)
  • 或者无论如何我可以访问应用程序上的那个文件夹?
  • UWP 应用可以访问的文件夹列表:File access permissions。您可以尝试打开文件夹选择器,也可以在链接中找到。

标签: iis uwp storage wwwroot


【解决方案1】:

我会添加一个答案,因为这个要求有些棘手。

第一个是应用can only access a few folders,inetpub不是其中之一。

使用代理的 Windows 运行时组件(我建议使用 FullTrustProcessLauncher,它的开发和部署要简单得多)可以使 UWP 应用程序以与传统桌面应用程序相同的方式访问文件夹。

虽然这适用于普通文件夹,但 inetpub 文件夹不同,它需要 管理员权限 才能写入,除非您关闭 UAC。

应用启动的桌面组件也没有足够的权限写入该文件夹。

因此它认为另一种方法是在 IIS 管理器中设置一个虚拟目录,该目录映射到公共图片库中的一个文件夹,然后应用程序将图片保存到该文件夹​​。

从网站的角度来看,虚拟目录和inetpub下的真实文件夹是一样的,不同的是访问权限。

【讨论】:

  • 好方法!这是一个很好的方法,我不知道 FullTrustProcessLauncher,会读一下,谢谢!
  • @IpsitGaur 谢谢!它是 UWP 中的一项新功能,将桌面 exe 添加到 appx 包中,然后从应用程序中启动该 exe。您需要做的就是在 appx 清单中正确声明功能,这比代理组件容易得多,缺点是您无法获得返回执行结果。
  • 嗨!非常感谢您的建议!只是一个问题...如果我选择将文件上传到文件夹中可以实现吗?我阅读了有关 www.root 的信息并遇到“上传”,不太确定它的作用......或者它与我可以寻找的相似(无法实现)
  • @thalassophile 如果您的意思是从应用程序中上传到 IIS 文件夹,那么可以!然后,您不仅需要实现 uwp 应用程序,还需要一个可以调用以 POST 数据的 http 端点。
  • @kennyzx 是的,我可以上传到该应用程序内的“照片”文件夹吗?哦不,什么是 http endpint……对不起……对所有这些都很陌生
【解决方案2】:

Kennyzx 就在这里,由于权限,您无法通过 UWP 应用程序访问 inetpub 文件夹。

但如果您的应用程序满足以下条件,那么您可以使用代理 Windows 组件(您应用程序中的一个组件)将您的文件复制到系统中的任何位置。

  1. 您的应用程序是 LOB 应用程序
  2. 您只针对桌面设备(由于您的要求,我认为这是真的)
  3. 您正在为您的应用安装和分发使用侧载。

如果这三个都是“是”,则将Brokered Windows Component 用于 UWP,这不是一件小事,可以在这里使用示例在 SO 上展示。因此,值得尝试阅读并实施它。

【讨论】:

  • 嗨!感谢你的建议!不幸的是,我的申请不符合列出的标准...
猜你喜欢
  • 2012-10-10
  • 2016-05-07
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多