파일을 받는 방법(HTML)
[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]
파일을 공유하려면 텍스트와 같은 단순한 데이터 형식에 비해 약간의 준비 과정이 필요합니다. 파일을 공유하려면 파일을 처리하는 데 걸리는 시간을 고려해야 합니다.
사용자가 공유하려는 파일을 앱에서 처리하는 데 오래 걸릴 경우 처리하기 전에 reportStarted를 호출해야 합니다. 이 메서드는 처리를 완료할 때까지 앱을 활성화된 상태로 유지하도록 합니다. 앱에서 처리를 완료하면 reportCompleted를 호출하여 공유 작업을 완료합니다. 자세한 내용은 빠른 시작: 공유 콘텐츠 받기의 "확장 공유 상태 보고"를 참조하세요.
알아야 할 사항
기술
사전 요구 사항
- Visual Studio 및 관련 템플릿을 잘 알고 있어야 합니다.
- JavaScript에 대해 잘 알고 있어야 합니다.
지침
단계 1: 공유 계약 지원
앱이 공유 콘텐츠를 받을 수 있으려면 먼저 공유 계약을 지원한다고 선언해야 합니다. 이 계약을 통해 시스템에서 앱이 콘텐츠를 받을 수 있음을 확인합니다. Microsoft Visual Studio 템플릿을 사용하여 앱을 만드는 경우 대상 공유 계약을 지원하는 방식은 다음과 같습니다.
- 매니페스트 파일(package.appxmanifest)을 엽니다.
- 선언 탭을 엽니다.
- 사용 가능한 선언 목록에서 공유 대상을 선택합니다.
- 추가를 클릭하여 앱에서 대상 공유 계약에 대한 지원을 추가합니다.
단계 2: 앱에서 지원하는 파일 형식을 지정합니다.
앱 매니페스트에 확장명을 지정하여 앱이 지원하는 파일 형식을 지정할 수 있습니다.
- 매니페스트 파일을 엽니다.
- 데이터 서식 섹션에서 새로 추가를 클릭합니다.
- ".txt" 같은 파일 이름 확장명을 따옴표 없이 입력합니다.
- 추가 파일 형식에 대해 이전 단계를 반복합니다.
이전 단계에서는 다음 섹션을 매니페스트에 추가합니다.
<Extensions>
<Extension Category="windows.shareTarget">
<ShareTarget>
<SupportedFileTypes>
<FileType>.txt</FileType>
</ShareTarget>
</Extension>
</Extensions>
참고 데이터 서식 섹션에서 StorageItems를 지정할 필요가 없습니다. 이 작업에 대한 지원은 매니페스트의 SupportedFileTypes 섹션에서 추론됩니다. 앱이 모든 파일 형식을 지원하는 경우 매니페스트에서 모든 파일 형식 지원을 선택하여 지정할 수 있습니다.
참고 앱이 대상 공유 계약에 대해 활성화되면 다른 진입점을 지정할 수 있습니다. 이렇게 하려면 패키지 매니페스트에 있는 대상 공유 선언의 앱 설정 섹션에서 시작 페이지 항목을 수정합니다. 또한 이 페이지에 대한 활성화를 처리하는 별도의 JavaScript 파일을 사용하는 것이 좋습니다. 예제는 콘텐츠 공유 대상 앱 샘플(영문)을 참조하세요.
단계 3: 앱이 활성화되면 이를 검색하는 이벤트 처리기를 추가합니다.
사용자가 콘텐츠를 공유할 앱을 선택하면 시스템에서 해당 앱을 활성화합니다. 다양한 방법으로 앱을 활성화할 수 있기 때문에 활성화된 이유를 검색하는 코드를 추가해야 합니다. 이렇게 하려면 kind 속성의 값을 확인합니다.
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The application has been launched. Initialize as appropriate.
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
...
}
};
단계 4: ShareOperation 개체를 가져옵니다.
ShareOperation 개체에는 앱이 사용자가 공유하려는 콘텐츠를 가져오는 데 필요한 모든 데이터가 포함되어 있습니다.
shareOperation = args.detail.shareOperation;
단계 5: 활성화된 이벤트 처리기에서 신속하게 반환합니다.
activated 이벤트 처리기에서 신속하게 반환해야 합니다. activated 이벤트 처리기에서 비동기 이벤트를 큐에 넣어 활성화된 이벤트가 반환된 후 데이터 공유 처리가 수행되도록 합니다.
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
나머지 단계에서는 shareReady
함수를 구현합니다.
단계 6: DataPackageView에 StorageItems가 포함되어 있는지 확인합니다.
ShareOperation 개체에는 DataPackageView 개체가 포함되어 있습니다. 이 개체는 원본 앱이 데이터를 만드는 데 사용한 DataPackage 개체의 읽기 전용 버전입니다. 이 개체를 사용하여 공유 중인 콘텐츠에 StorageItems가 있는지 확인합니다.
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
// Data being shared contains one or more StorageItem. Code to process the StorageItems goes here.
}
앱이 한 가지 형식만 지원하는 경우에도 DataPackage에 원하는 데이터 서식이 포함되어 있는지 확인하는 것이 좋습니다. 이렇게 하면 나중에 다른 데이터 서식을 쉽게 지원할 수 있습니다.
단계 7: 파일을 처리합니다.
파일을 가져오려면 DataPackageView.GetStorageItemsAsync 메서드를 호출합니다.
shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
var fileList = "";
for (var i = 0; i < storageItems.size; i++) {
fileList += storageItems.getAt(i).name;
if (i < storageItems.size - 1) {
fileList += ", ";
}
}
// In this example, we only display the file names. To do this, you need
// a <div> element with an id of "output" in your HTML page.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Files: " + fileList;
});
참고
파일을 처리하는 데 오래 걸릴 수 있습니다. 앱에서 데이터를 로드하여 처리할 때까지 사용자를 기다리게 해서는 안 됩니다. Windows 8.1에서는 reportStarted 메서드를 호출하여 앱이 공유되는 콘텐츠를 처리하기 시작했음을 시스템에 알릴 수 있습니다. 시스템은 사용자가 앱을 종료하고 원본 앱으로 돌아가더라도 reportCompleted를 호출할 때까지 앱을 활성화된 상태로 유지합니다. 자세한 내용은 빠른 시작: 공유 콘텐츠 받기의 "확장 공유 상태 보고"를 참조하세요.
단계 8: reportCompleted를 호출합니다.
앱이 콘텐츠 공유를 마치면 reportCompleted를 호출합니다. 이 메서드를 호출하면 시스템에서 앱을 종료합니다.
shareOperation.reportCompleted();
설명
콘텐츠 공유 대상 앱 샘플(영문) 코드 샘플에서 텍스트를 공유의 일부로 받는 앱의 전체 종단 간 환경을 확인해 보세요.
전체 예제
var shareOperation = null;
function shareReady(args) {
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
var fileList = "";
for (var i = 0; i < storageItems.size; i++) {
fileList += storageItems.getAt(i).name;
if (i < storageItems.size - 1) {
fileList += ", ";
}
}
// In this example, we only display the file names. To do this, you need
// a <div> element with an id of "output" in your HTML page.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Files: " + fileList;
});
}
}
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The app has been launched.
args.setPromise(WinJS.UI.processAll());
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
// This app was activated for the Share contract.
args.setPromise(WinJS.UI.processAll());
// We receive the ShareOperation object as part of the eventArgs.
shareOperation = args.detail.shareOperation;
// We queue an asychronous event so that working with the ShareOperation
// object does not block or delay the return of the activation handler.
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
}
};
관련 항목
Windows.ApplicationModel.DataTransfer